此代码生成MemoryError
:
from pylab import complex128
import numpy
x = numpy.empty(100000000, dtype=complex128) # 100 millions complex128
我有8 GB内存的Win7 64(运行此代码时至少可免费使用5.3 GB)。我正在使用Python 2.7(Anaconda),我认为它是32位版本。即使有32位,我们也应该可以处理1.6 GB!
你知道如何解决这个问题吗?
PS:我期望一个包含1亿个项目的数组,每个项目使用16个字节(128位)来使用16 * 100百万= 1.6 GB。这可以通过以下方式得到证实:
x = numpy.empty(1000000, dtype=complex128) # 1 million here
print x.nbytes
>>> 16000000 # 16 MB
答案 0 :(得分:5)
使用Python 64bit解决了这个问题。
甚至可以创建一个超过5 GB的单个数组。
注意:当我创建一个应该使用1 600 000 000字节的数组(在complex128
数组中有1亿个项目)时,实际的内存使用量并不是“更多”:1 607 068 KB ..
答案 1 :(得分:3)
我知道它的老问题。我知道有很多类似的问题。恩。 Memory for python.exe on Windows 7 python 32 - Numpy uses half of the available memory only?但他们似乎都没有真正解决这个问题。
使用此处给出的提示https://stackoverflow.com/a/18282931/566035,我想我最终解决了这个问题。
首先,您需要安装" Microsoft Visual C ++ Express Edition 2008"。您可以按照此处提供的说明进行操作:http://blog.victorjabur.com/2011/06/05/compiling-python-2-7-modules-on-windows-32-and-64-using-msvc-2008-express/
上述博客文章中的Microsoft Visual C ++ Express Edition 2008的下载URL已失效。但是,您可以在Visual C++ 2008 Express Download Link Dead?找到该网址。
(编辑)我确认msvc-2010-express附带的链接器也有效。
然后,从开始菜单启动 Visual Studio 2008命令提示符 - > Microsoft Visual C ++ 2008 Express Edition - > Visual Studio工具 - > Visual Studio 2008命令提示符
然后执行以下命令:
cd bin
editbin.exe /LARGEADDRESSAWARE "C:\Python27\python.exe"
这将在python可执行文件中设置IMAGE_FILE_LARGE_ADDRESS_AWARE flag。有了这个魔力,32位python将使用高达4 GB(而不是在Windows上为2 GB)。
根据MSDN:
在64位版本的Windows上,32位应用程序标有 IMAGE_FILE_LARGE_ADDRESS_AWARE标志有4 GB的地址空间 可用。
现在,
x = numpy.empty(100000000, dtype=complex128)
实际上可以在我的Windows 7 64位PC上使用32位Python 2.7。
我真的希望官方的python二进制文件已经与这个FLAG一起发布了,因为这样做没有什么害处,但是巨大的好处!
正如MSDN所说:
设置此标志,然后在系统上运行该应用程序 没有4GT支持不应该影响应用程序。