内存错误和列表限制?

时间:2011-04-04 11:09:39

标签: python list memory limits

我需要为科学目的生产大型和大型(非常)矩阵(马尔可夫链)。我执行微积分,我放入20301元素列表(=我的矩阵的一行)。我需要内存中的所有数据继续下一步Markov步骤但我可以将它们存储在别处(例如文件),如果需要的话,即使它会减慢我的马尔可夫链步入。我的电脑(科学实验室):Bi-xenon 6核/ 12threads,12GB内存,操作系统:win64

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

微积分结果示例:9.233747520008198e-102(是的,它超过1/9000)

存储第19766个元素时会引发错误:

ListTemp[19766]
1.4509421012263216e-103

如果我走得更远

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

所以这个列表在19767循环中有一个内存错误。

的问题:

  1. 列表是否有内存限制? 这是一个“按列表限制”还是一个 “每个脚本的全局限制”?

  2. 如何绕过这些限制? 任何可能的想法?

  3. 使用numpy,python64会有帮助吗?什么 是他们的记忆限制?什么 关于其他语言?

4 个答案:

答案 0 :(得分:51)

首先,请参阅How Big can a Python Array Get?Numpy, problem with long arrays

其次,唯一的实际限制来自您拥有的内存量以及系统如何存储内存引用。没有每个列表限制,因此Python将一直运行到内存不足。两种可能性:

  1. 如果您运行的是较旧的操作系统或强制进程使用有限内存的操作系统,则可能需要增加Python进程可以访问的内存量。
  2. 使用分块将列表分开。例如,执行列表的前1000个元素,pickle并将它们保存到磁盘,然后执行下一个1000.要使用它们,一次取消一个块,以便不会耗尽内存。这基本上与数据库用于处理比RAM更适合的数据的技术相同。

答案 1 :(得分:24)

您看到的MemoryError异常是可用RAM耗尽的直接结果。这可能是由Windows(32bit programs)施加的每个程序限制2GB或计算机上缺少可用RAM造成的。 (这个link是前一个问题)。

如果您使用64位的Windows副本,则应该可以使用64位的Python副本扩展2GB。

IndexError会导致MemoryError,因为Python在计算整个数组之前会遇到{{1}}异常。这又是一个记忆问题。

要解决此问题,您可以尝试使用64位的Python副本,或者更好地找到一种方法将结果写入文件。为此,请看numpy的memory mapped arrays

您应该能够将整个计算集运行到其中一个阵列中,因为实际数据将写入磁盘,并且只有一小部分计算在内存中。

答案 2 :(得分:7)

Python没有内存限制。但是,如果RAM耗尽,您将获得MemoryError。你说list中有20301个元素。这似乎太小而不能导致简单数据类型(例如int)的内存错误,但如果每个元素本身都是一个占用大量内存的对象,那么你可能会耗尽内存。

IndexError可能是因为你的ListTemp只有19767个元素(索引为0到19766),而你试图访问最后一个元素。

很难说你怎么做才能避免在不知道你想要做什么的情况下达到极限。使用numpy可能有所帮助。看起来你正在存储大量数据。可能您不需要在每个阶段存储所有内容。但是如果不知道就不可能说出来。

答案 3 :(得分:0)

如果你想绕过这个问题,你也可以使用搁架。然后你会创建一个大小与你的机器处理能力相当的文件,并且只在必要时将它们放在RAM上,基本上写入HD并将信息拉回来以便你可以处理它。

创建二进制文件并检查信息是否已包含在其中如果是,则使一个局部变量保留它,否则写一些您认为必要的数据。

Data = shelve.open('File01')
   for i in range(0,100):
     Matrix_Shelve = 'Matrix' + str(i)
     if Matrix_Shelve in Data:
        Matrix_local = Data[Matrix_Shelve]
     else:
        Data[Matrix_Selve] = 'somenthingforlater'

希望它听起来不太古怪。