2013-11-22 52 views
6

分配1.6 GB此代碼生成一個MemoryError無法在Python

from pylab import complex128 
import numpy 

x = numpy.empty(100000000, dtype=complex128) # 100 millions complex128 

我有Win7的64 8 GB RAM(至少5.3運行此代碼時GB免費)。我使用Python 2.7(Anaconda),我認爲它是32位版本。即使使用32位,我們也應該能夠處理1.6 GB!

你知道如何解決這個問題嗎? PS:我預計有一個數億的項目,每一個使用16個字節(128位)來使用16 * 100百萬= 1.6 GB。這被確認:

x = numpy.empty(1000000, dtype=complex128) # 1 million here 
print x.nbytes 
>>> 16000000  # 16 MB 
+3

你怎麼知道列表只有1.5GB小?在嘗試分配額外的1.5GB之前,您是否測量了進程內存使用量?已經使用了多少內存? 32bit意味着每個進程的理論上限爲2GB。 –

+1

128位=每個項目16個字節。 1億1千萬次16是約。 1.6 GB。 – Basj

+2

這假定沒有開銷。 –

回答

5

這個問題已被Python 64位解決。

甚至可以創建一個大於5 GB的單個數組。

注:當我創建這應該(在一個complex128陣列100萬件)使用1 600 000 000字節數組,實際使用的內存不是「多」更多:1 607 068 KB ...

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的命令提示符從開始菜單 - >微軟的Visual C++ 2008速成版 - > Visual Studio工具 - > Visual Studio 2008的命令提示符

然後執行以下命令:

​​

這將在python可執行文件中設置IMAGE_FILE_LARGE_ADDRESS_AWARE flag。有了這個魔法,32位Python將使用高達4 GB(而不是Windows上的〜2 GB)。

根據MSDN:

在Windows的64位版本,標有 IMAGE_FILE_LARGE_ADDRESS_AWARE標誌的32位應用程序都有4 GB的地址空間 可用。

現在,

x = numpy.empty(100000000, dtype=complex128) 

實際工作我的Windows 7 64位PC上的32位的Python 2.7。

我真的希望官方的Python二進制文件已經與這個FLAG一起發佈了,因爲這樣做沒有壞處,但是巨大的好處!

由於MSDN說:

設置該標誌,然後運行 沒有4GT支持應該不會影響應用程序的系統上的應用。