2014-04-21 51 views
0

我想处理一些利用python的数据,但经常遇到“MemoryError”。对于我的数据处理,我需要运行一个循环〜400次。问题是,每当我进入这个循环20-30次时,我都会得到“MemoryError”。在观看任务管理器时,这似乎发生在python.exe * 32为〜1 GB时。我会使用64位Python,但我需要的一些库只有32位。而且,在每个循环调用的主函数结束时,我正在使用del函数来处理每个我使用的变量。当发生“MemoryError”时,我必须完全退出解释器,否则如果我尝试再次重新执行它,它会自动失败并显示“MemoryError”。Python27内存错误问题

我使用Python(X,Y)2.7和必须满足下列条件: numpy的 scipy.io matplotlib pyopencl pyfft

+0

是否有可能在短程序中重现此错误?如果是这样,你应该在这里发布。 –

+0

我不太确定。我工作的代码非常冗长。我原本没有写它,我只是想用它来进行数据处理,所以很多opencl的东西都在我的头上。如果它计算任何东西,那么程序总是会在大约相当于30-40次迭代的同一行中失败,其中 s =零((A,B,C),complex128) – user2208604

+0

我不明白,因为ti好像是在创建那零矩阵不应该是非常重要的? – user2208604

回答

3

你说坠毁,机上这样一行:

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地址空间周围“散落”,最终可能无法分配四分之一千兆字节大块所有在一起。

你应该在这里做的是分配你的矩阵一次并重用它。当你的程序刚刚开始时,你很可能成功分配235 MB数组,并且稍后可以清除它,然后重新使用它,而无需再次分配。或者你可以(a)移动到64位,或(b)花费相当多的时间来追踪为什么在运行垃圾收集语言一段时间后你不能分配一个大的连续块。

+0

哇,谢谢你的详细解答。一些内存管理的东西有点凌驾于我的头脑上,但我对你的评论大肆嘲笑:D。所以,我每次通过循环调用的函数都是为每个实例定义's ='。我以为我会在这里好,因为我在这个函数的末尾使用'del s'。我会重试这个脚本,而只分配一次。谢谢! – user2208604