内存错误和列表限制?
为了科学目的,我需要生成大的(非常)matrix(马尔可夫链)。 我执行微积分,我把20301元素列表(=我matrix的一行)。 我需要在内存中的所有这些数据继续下一步马尔可夫步骤,但如果需要,我可以将它们存储在其他地方(例如文件),即使它会减慢我的马尔可夫链走查。 我的电脑(科学实验室):双氙气6核/ 12线程,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吗? 与他们的内存限制是什么? 其他语言呢?
首先,请参阅Python数组如何获取? 和Numpy,长arrays的问题
其次,唯一真正的限制来自于你拥有的内存数量以及你的系统如何存储内存引用。 没有每个列表的限制,所以Python会一直运行直到内存不足。 两种可能性:
- 如果您运行的是较旧的操作系统,或者强制进程使用有限的内存,则可能需要增加Python进程访问的内存量。
- 使用分块将列表分开。 例如,执行列表的前1000个元素,将其保存到磁盘,然后执行下一个1000.要使用它们,请一次取下一个块,以便不会耗尽内存。 这与数据库用于处理更多数据的技术本质上是相同的技术。
您看到的MemoryError
exception是可用RAM耗尽的直接结果。 这可能是由于Windows( 32位程序 )所规定的每个程序限制2GB或计算机上缺less可用内存引起的。 (这个链接是前一个问题)。
如果您使用的是64位Windows副本,则应该可以使用64位Python副本来扩展2GB。
IndexError
是由于Python在计算整个数组之前遇到MemoryError
exception而导致的。 这又是一个记忆问题。
为了解决这个问题,你可以尝试使用Python的64位副本,或者更好地find一种方法来将结果写入文件。 为此,看看numpy的内存映射数组 。
你应该可以将整套计算运行到这些数组之一中,因为实际的数据将被写入磁盘,并且只有一小部分保存在内存中。
Python没有内存限制。 但是,如果内存不足,则会发生MemoryError
。 你说你在list
有20301个元素。 这似乎太小,不会导致简单数据types(如int
)的内存错误,但如果每个元素本身是一个占用大量内存的对象,则可能是内存不足。
然而, IndexError
可能是由于你的ListTemp
只有19767个元素(索引为0到19766)而引起的,而你试图访问最后一个元素。
很难说如果不知道你想要做什么,就可以避免达到极限。 使用numpy
可能会有帮助。 它看起来像你正在存储大量的数据。 也许你不需要在每个阶段都存储它。 但是不知不觉就说不出来。