无法在Python中分配1.6 GB

时间:2013-11-22 17:26:02

标签: python memory-management numpy

此代码生成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

2 个答案:

答案 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支持不应该影响应用程序。