我已經開始使用一個相當大的模擬代碼,它需要存儲高達189383040
浮點數。我知道,這很大,但沒有太多可以做到克服這個問題,比如只查看其中的一部分或逐個處理它們。Python內存錯誤使用長列表時不會發生在Linux上
我寫了一個簡短的腳本,其再現誤差,所以我可以快速地測試它在不同的環境:
noSnapshots = 1830
noObjects = 14784
objectsDict={}
for obj in range(0, noObjects):
objectsDict[obj]=[[],[],[]]
for snapshot in range(0,noSnapshots):
objectsDict[obj][0].append([1.232143454,1.232143454,1.232143454])
objectsDict[obj][1].append([1.232143454,1.232143454,1.232143454])
objectsDict[obj][2].append(1.232143454)
它代表實際的代碼的結構,其中的一些參數(2 lists
長度爲3的每個和1個浮動)必須針對每個14784
對象存儲在1830
不同的位置。顯然這些數字每次都會有不同的對象,但在我的代碼中,我只是去了一些隨機輸入的數字。
我覺得這並不令人驚訝,它在Windows 7 Enterprise和家庭高級版上使用MemoryError
時失敗。即使我在16 GB RAM的機器上運行代碼,它仍會失敗,即使機器上仍有大量內存。所以第一個問題是:爲什麼會這樣呢?我想認爲,我擁有的內存越多,我可以在內存中存儲的東西越多。
我在我的同事的Ubuntu 12.04機器上運行相同的代碼(再次使用16 GB的RAM)並且它沒有問題。所以我想知道的另一件事是:有什麼我可以做的,使Windows與此代碼感到滿意?即在堆和棧上給我的Python進程更多的內存?
終於:有沒有人有任何建議,如何以類似於在示例代碼中的方式存儲大量的數據在內存中?
編輯
的答案後,我改變了代碼:
import numpy
noSnapshots = 1830
noObjects = int(14784*1.3)
objectsDict={}
for obj in range(0, noObjects):
objectsDict[obj]=[[],[],[]]
objectsDict[obj][0].append(numpy.random.rand(noSnapshots,3))
objectsDict[obj][1].append(numpy.random.rand(noSnapshots,3))
objectsDict[obj][2].append(numpy.random.rand(noSnapshots,1))
和它的作品,儘管大量數據的情況,必須加以保存。
您是否在Windows上使用64位版本的Python? – geoffspear
好點。這是一個32b的Windows和64b Linux。 –
將可用於Windows的RAM限制爲4GB。 – Max