簡體   English   中英

64位Python中的MemoryError?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM