我需要为科学目的生产大型和大型(非常)矩阵(马尔可夫链)。我执行微积分,我放入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循环中有一个内存错误。
列表是否有内存限制? 这是一个“按列表限制”还是一个 “每个脚本的全局限制”?
如何绕过这些限制? 任何可能的想法?
使用numpy,python64会有帮助吗?什么 是他们的记忆限制?什么 关于其他语言?
答案 0 :(得分:51)
首先,请参阅How Big can a Python Array Get?和Numpy, problem with long arrays
其次,唯一的实际限制来自您拥有的内存量以及系统如何存储内存引用。没有每个列表限制,因此Python将一直运行到内存不足。两种可能性:
答案 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'
希望它听起来不太古怪。