[英]MemoryError in 64-bit Python?
我在Linux上運行64位Python 3,並且我有一個代碼生成包含大約20,000個元素的列表。 當我的代碼嘗試通過pickle
模塊將約20,000個2D數組的列表寫入二進制文件時發生了內存錯誤,但是它生成了所有這些數組並將它們附加到此列表中,而沒有出現問題。 我知道這必須占用大量內存,但是我正在使用的計算機大約有100GB的可用空間(來自命令free -m
)。 出現錯誤的行:
with open('all_data.data', 'wb') as f:
pickle.dump(data, f)
>>> MemoryError
data
是我約20,000個numpy數組的列表。 另外,以前我試圖用大約55,000個元素運行此代碼,但是盡管將所有數組追加到data
列表的過程是40%,但是它只是輸出Killed
本身。 所以現在我試圖將其分成多個部分,但是這次我遇到了MemoryError。 我該如何繞過呢? 我還被告知可以訪問多個CPU,但是我不知道如何利用這些CPU(我還不了解multiprocessing
)。
Pickle將嘗試解析所有數據,並可能在將所有內容寫入磁盤之前將其轉換為中間狀態-因此,如果您使用的可用內存約占一半,它將消耗blow盡。
由於您的數據已經在列表中,因此一種簡單的解決方法是對每個數組進行腌制並存儲,而不是嘗試一次序列化20000個數組:
with open('all_data.data', 'wb') as f:
for item in data:
pickle.dump(item, f)
然后,要讀回它,只需保持從文件中解開對象,然后追加到列表中,直到文件用完:
data = []
with open('all_data.data', 'rb') as f:
while True:
try:
data.append(pickle.load(f))
except EOFError:
break
之所以起作用,是因為從文件中取消拾取的行為非常好:文件指針恰好位於存儲在文件中的腌制對象結束的位置-因此,進一步的讀取從下一個對象的開頭開始。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.