内存错误和列表限制?
问题内容:
为了科学目的,我需要产生越来越大的(非常)矩阵(马尔可夫链)。我执行微积分,将其放入20301个元素的列表中(=矩阵的一行)。我需要将所有这些数据存储在内存中以继续进行下一步的马尔可夫步骤,但是如果需要,我可以将它们存储在其他位置(例如文件),即使这会减慢我的马尔可夫链的遍历速度。我的电脑(科学实验室):双氙气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,长数组问题
其次,唯一的实际限制来自您拥有的内存量以及系统存储内存引用的方式。没有每个列表的限制,因此Python会一直运行直到内存耗尽。两种可能性:
- 如果您在较旧的操作系统上运行,或者在迫使进程使用有限数量的内存的操作系统上运行,则可能需要增加Python进程可以访问的内存数量。
- 使用分块将列表分开。例如,执行列表的前1000个元素,腌制并将其保存到磁盘,然后再执行下1000个。要使用它们,请一次释放一个块,以免耗尽内存。从本质上讲,这与数据库用于处理超过RAM中容纳的更多数据的技术相同。