Python 内存错误和列表限制?
为了科学的目的,我需要生成大的和大的(非常)矩阵(马尔可夫链)。我执行微积分,将其放入20301个元素的列表(=矩阵的一行)。我需要内存中的所有这些数据来进行下一个马尔可夫步骤,但如果需要,我可以将它们存储在其他地方(例如文件),即使这会减慢我的马尔可夫链遍历速度。我的计算机(科学实验室):双氙气6核/每个12线程,12GB内存,操作系统:win64Python 内存错误和列表限制?,python,list,memory,limits,Python,List,Memory,Limits,为了科学的目的,我需要生成大的和大的(非常)矩阵(马尔可夫链)。我执行微积分,将其放入20301个元素的列表(=矩阵的一行)。我需要内存中的所有这些数据来进行下一个马尔可夫步骤,但如果需要,我可以将它们存储在其他地方(例如文件),即使这会减慢我的马尔可夫链遍历速度。我的计算机(科学实验室):双氙气6核/每个12线程,12GB内存,操作系统:win64 回溯(最近一次呼叫最后一次): 文件“my_File.py”,第247行,在 ListTemp.append(微积分) 记忆者 微积分结果示例:
回溯(最近一次呼叫最后一次):
文件“my_File.py”,第247行,在
ListTemp.append(微积分)
记忆者
微积分结果示例:9.233747520008198e-102(是的,超过1/9000)
存储19766元素时引发错误:
ListTemp[19766]
1.4509421012263216e-103
如果我更进一步
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ListTemp[19767]
索引器:列表索引超出范围
所以这个列表在19767循环中有一个内存错误
问题:
Python没有强加内存限制。但是,如果内存不足,您将得到一个
内存错误。您说在列表中有20301个元素。对于简单数据类型(例如,int
),这似乎太小而不会导致内存错误,但如果每个元素本身都是占用大量内存的对象,则很可能内存不足
但是,indexer错误
可能是因为您的listemp
只有19767个元素(索引为0到19766),并且您试图访问最后一个元素
如果不确切知道你想做什么,很难说你能做些什么来避免达到极限。使用numpy
可能会有所帮助。看起来您正在存储大量数据。可能您不需要在每个阶段都存储所有信息。但是不知道就不可能说。您看到的内存错误
异常是可用RAM耗尽的直接结果。这可能是由于Windows()对每个程序施加了2GB的限制,或者计算机上缺少可用RAM造成的。(这是对上一个问题的回答)
如果您使用的是64位的windows副本,那么您应该能够通过使用64位的Python副本来扩展2GB
之所以会出现索引器错误
,是因为Python在计算整个数组之前遇到了内存错误
异常。这也是一个内存问题
为了解决这个问题,您可以尝试使用64位的Python副本,或者更好地找到将结果写入文件的方法。为此,请看numpy的
您应该能够将整个计算集运行到其中一个阵列中,因为实际数据将写入磁盘,并且只有一小部分存储在内存中。首先,请参阅和
其次,唯一真正的限制来自您拥有的内存量以及系统存储内存引用的方式。没有每个列表的限制,因此Python将一直运行到内存耗尽为止。两种可能性:
如果您运行的是较旧的操作系统或是强制进程使用有限内存的操作系统,则可能需要增加Python进程可以访问的内存量
使用组块将列表分开。例如,执行列表的前1000个元素,pickle并将其保存到磁盘,然后执行下一个1000。要使用它们,请一次解开一个块,这样就不会耗尽内存。这基本上是数据库用来处理超过RAM容量的数据的相同技术
如果你想避开这个问题,你也可以使用架子。然后,您将创建与您的机器处理能力相当的文件,并仅在必要时将其放在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'
希望它听起来不太神秘。因此,32位系统上python列表的最大大小为536870912个元素。好的,但在我的例子中,我对这个值很满意,在这个进程中我的内存只有~1.3gb(接近python32进程的极限?)。python64的限制是什么?分块对我的马尔可夫链演练有多慢?谢谢大家的回答和建议。学习的好地方!32位进程的理论内存限制为4GB,但如果您的操作系统也是32位的,它显然会更少,因为操作系统会占用一些内存。分块将使您的速度减慢,但在某些情况下,您必须接受一个缓慢的过程才能完成处理。您在该列表中存储了什么?也许这有助于解释发生了什么。你好,托马斯,我想你是对的,我必须让我的python32在我的windows-7-64b上强加给每个程序的2GB溢出。python64程序的限制是什么?要感谢的不仅仅是机器中的物理内存,因为您通过移动到64位来调整地址空间的大小:)@ncoghlan是正确的。如果您遵循第二行中的链接,则会提到限制。这是一个惊人的8 TB。如果你达到了这个极限,那么你肯定做错了什么:)Python和其他任何程序一样,使用整个虚拟内存,而不仅仅是物理内存(RAM)。海报可以增加可用的交换内存(Windows中的文件和Linux中的分区)。您也可以在Linux上使用交换文件。摘自Arch Wiki: