Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 Python27内存错误问题_Python 2.7_Memory_Pyopencl_Pythonxy - Fatal编程技术网

Python 2.7 Python27内存错误问题

Python 2.7 Python27内存错误问题,python-2.7,memory,pyopencl,pythonxy,Python 2.7,Memory,Pyopencl,Pythonxy,我试图使用python处理一些数据,但经常遇到“MemoryError”。对于我的数据处理,我需要运行一个循环约400次。问题是,每次我进入这个循环20-30次,我就会得到“MemoryError”。在观看任务管理器时,当python.exe*32为~1 GB时,会出现这种情况。我会使用64位python,但我需要的一些库只有32位。此外,在我用每个循环调用的主函数的末尾,我对我使用的每个变量都使用del函数。当“MemoryError”发生时,我必须完全退出解释器,否则,如果我再次尝试重新连接

我试图使用python处理一些数据,但经常遇到“MemoryError”。对于我的数据处理,我需要运行一个循环约400次。问题是,每次我进入这个循环20-30次,我就会得到“MemoryError”。在观看任务管理器时,当python.exe*32为~1 GB时,会出现这种情况。我会使用64位python,但我需要的一些库只有32位。此外,在我用每个循环调用的主函数的末尾,我对我使用的每个变量都使用del函数。当“MemoryError”发生时,我必须完全退出解释器,否则,如果我再次尝试重新连接它,它将自动以“MemoryError”失败

我正在使用Python(x,y)2.7,需要以下内容: 努比 scipy.io matplotlib pyopencl
pyfft

你说它在这样一条线上崩溃了:

s = zeros((A,B,C),complex128)
A=2400,B=256,C=25。这将需要235MB的内存。而且不仅仅是任何235MB:它必须是连续的,因为NumPy希望将其作为单个数组使用

您还提到,您正在32位进程中运行此功能,当进程内存使用量达到1GB左右时,它会崩溃

这是不幸的,但并不完全令人惊讶。考虑32位进程中的总可用虚拟内存大约是3 GB,并且不可避免地会有一些“空洞”,这意味着您将永远无法分配一个大小为4 GB的单个数组。但是你能一件分配多少呢?好的,这取决于到目前为止分配的内存的碎片,因为程序仍然需要的虚拟地址可能会“散布”在其4GB地址空间周围,最终可能无法一起分配四分之一GB的块

您应该在这里做的是分配矩阵一次并重用它。当您的程序刚刚启动时,您极有可能成功分配235 MB阵列,您可以稍后在重用它之前清除它,而无需再次分配


或者,您可以(a)移动到64位,或者(b)在运行垃圾收集语言一段时间后,可能会花费相当多的时间来跟踪为什么无法分配大的连续块。

您说它在这样一行中崩溃了:

s = zeros((A,B,C),complex128)
A=2400,B=256,C=25。这将需要235MB的内存。而且不仅仅是任何235MB:它必须是连续的,因为NumPy希望将其作为单个数组使用

您还提到,您正在32位进程中运行此功能,当进程内存使用量达到1GB左右时,它会崩溃

这是不幸的,但并不完全令人惊讶。考虑32位进程中的总可用虚拟内存大约是3 GB,并且不可避免地会有一些“空洞”,这意味着您将永远无法分配一个大小为4 GB的单个数组。但是你能一件分配多少呢?好的,这取决于到目前为止分配的内存的碎片,因为程序仍然需要的虚拟地址可能会“散布”在其4GB地址空间周围,最终可能无法一起分配四分之一GB的块

您应该在这里做的是分配矩阵一次并重用它。当您的程序刚刚启动时,您极有可能成功分配235 MB阵列,您可以稍后在重用它之前清除它,而无需再次分配


或者,您可以(a)移动到64位,或者(b)花相当长的时间跟踪为什么在运行垃圾收集语言一段时间后无法分配大的连续块。

是否可以在短程序中重现此错误?如果是的话,你应该把它贴在这里。我不太确定。我使用的代码非常冗长。我最初并没有写它,我只是想用它来处理数据,所以很多opencl的东西我都不懂。如果它算得上什么的话,程序总是在大约30-40次s=zeros((A,B,C),complex128)迭代的同一行失败,这我不明白,因为ti似乎创建zeros矩阵不应该很费力?对于A=2400,B=256,C=25***你能在一个短程序中重现这个错误吗?如果是的话,你应该把它贴在这里。我不太确定。我使用的代码非常冗长。我最初并没有写它,我只是想用它来处理数据,所以很多opencl的东西我都不懂。如果它算得上什么的话,程序总是在大约30-40次迭代(s=zeros((A,B,C),complex128)的同一行失败,这我不明白,因为ti似乎创建zeros矩阵不应该太费力?对于A=2400,B=256,C=25****哇,谢谢你的详细回答。有些内存管理的东西我有点不知所措,但我得到了你评论中的一般笑话:D。因此,我每次通过循环调用的函数都是为每个实例定义“s=”。我想我在这里会没事的,因为我在这个函数的末尾使用了'del's'。我将重试此脚本,同时只分配一次。谢谢哇,谢谢你的详细回答。有些内存管理的东西我有点不知所措,但我得到了你评论中的一般笑话:D。因此,我每次通过循环调用的函数都是为每个实例定义“s=”。我想我在这里会没事的,因为我在这个函数的末尾使用了'del's'。我将重试此脚本,同时只分配一次。谢谢