Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Memory errors and list limits?

I need to produce large and big (very) matrices (Markov chains) for scientific purposes. I perform calculus that I put in a list of 20301 elements (=one row of my matrix). I need all those data in memory to proceed next Markov step but i can store them elsewhere (eg file) if needed even if it will slow my Markov chain walk-through. My computer (scientific lab): Bi-xenon 6 cores/12threads each, 12GB memory, OS: win64

  Traceback (most recent call last):   File "my_file.py", line 247, in <module>     ListTemp.append(calculus) MemoryError 

Example of calculus results: 9.233747520008198e-102 (yes, it's over 1/9000)

The error is raised when storing the 19766th element:

ListTemp[19766] 1.4509421012263216e-103 

If I go further

Traceback (most recent call last):   File "<pyshell#21>", line 1, in <module>     ListTemp[19767] IndexError: list index out of range 

So this list had a memory error at the 19767 loop.

Questions:

  1. Is there a memory limit to a list? Is it a "by-list limit" or a "global-per-script limit"?

  2. How to bypass those limits? Any possibilites in mind?

  3. Will it help to use numpy, python64? What are the memory limits with them? What about other languages?

like image 730
Taupi Avatar asked Apr 04 '11 11:04

Taupi


People also ask

What causes memory error?

Causes of such memory errors may be due to certain cognitive factors, such as spreading activation, or to physiological factors, including brain damage, age or emotional factors. Furthermore, memory errors have been reported in individuals with schizophrenia and depression.

How much memory does a list use?

It seems that a list object is not storing the items but a reference to items (i.e., the memory addresses). THAT'S TRUE. When you create a list object, the list object by itself takes 64 bytes of memory, and each item adds 8 bytes of memory to the size of the list because of references to other objects.


2 Answers

First off, see How Big can a Python Array Get? and Numpy, problem with long arrays

Second, the only real limit comes from the amount of memory you have and how your system stores memory references. There is no per-list limit, so Python will go until it runs out of memory. Two possibilities:

  1. If you are running on an older OS or one that forces processes to use a limited amount of memory, you may need to increase the amount of memory the Python process has access to.
  2. Break the list apart using chunking. For example, do the first 1000 elements of the list, pickle and save them to disk, and then do the next 1000. To work with them, unpickle one chunk at a time so that you don't run out of memory. This is essentially the same technique that databases use to work with more data than will fit in RAM.
like image 108
G Gordon Worley III Avatar answered Oct 17 '22 04:10

G Gordon Worley III


The MemoryError exception that you are seeing is the direct result of running out of available RAM. This could be caused by either the 2GB per program limit imposed by Windows (32bit programs), or lack of available RAM on your computer. (This link is to a previous question).

You should be able to extend the 2GB by using 64bit copy of Python, provided you are using a 64bit copy of windows.

The IndexError would be caused because Python hit the MemoryError exception before calculating the entire array. Again this is a memory issue.

To get around this problem you could try to use a 64bit copy of Python or better still find a way to write you results to file. To this end look at numpy's memory mapped arrays.

You should be able to run you entire set of calculation into one of these arrays as the actual data will be written disk, and only a small portion of it held in memory.

like image 43
thomas Avatar answered Oct 17 '22 02:10

thomas