我试图使用python处理一些数据,但遭遇" MemoryError"经常。对于我的数据处理,我需要运行一个循环~400次。问题是,每次我进入这个循环20-30次,我得到" MemoryError"。在观看任务管理器时,这似乎发生在python.exe * 32为~1 GB时。我会使用64位python,但我需要的一些库只有32位。此外,在主要功能的最后,我用每个循环调用,我使用del函数几乎用于我使用的每个变量。当" MemoryError"发生时,我必须完全退出解释器,否则如果我再次尝试重新重新启动它会自动失败,并出现" MemoryError"。
我使用Python(x,y)2.7并需要以下内容: numpy的 scipy.io matplotlib pyopencl pyfft
答案 0 :(得分:4)
你说它在这样的一条线上坠毁了:
s = zeros((A,B,C),complex128)
A = 2400,B = 256,C = 25。这将需要235 MB的内存。而且不仅仅是任何235 MB:它必须是连续的,因为NumPy希望将它用作单个阵列。
您还提到您在32位进程中运行此操作,并且当进程内存使用量大约为1 GB时崩溃。
这是不幸的,但并不完全令人惊讶。考虑到32位进程中的总可用虚拟内存大约为3 GB,并且不可避免地会出现一些"漏洞"这意味着您永远无法分配4 GB大小的单个阵列。但是你可以分配多少钱?嗯,这取决于你到目前为止分配的内存碎片,因为你的程序仍然需要的虚拟地址可能会被“洒”"它的4 GB地址空间,最终你可能无法一起分配一个四分之一GB的块。
这里你应该做的是分配你的矩阵一次并重复使用它。刚启动程序时,您极有可能成功分配235 MB阵列,稍后可以在重新使用之前将其清除,而无需再次分配。
或者你可以(a)转移到64位,或者(b)花费相当多的时间来追踪为什么在运行垃圾收集语言一段时间之后你不能分配一个大的连续块