我正在運行一個非常簡單的代碼來讀入 txt 檔案并將它們添加到現有字典中。使用 htop 我看到使用的記憶體線性增加,直到我用完記憶體。這是代碼的簡化版本:
import numpy as np
data = np.load(path_dictionary, allow_pickle=True)
dic = data.item()
for ids in dic:
output = np.loadtxt(filename)
array = output[:,1]
dic[ids][new_info] = array
我試圖洗掉輸出并在回圈中添加了一個垃圾收集器,但沒有幫助。
del output
del array
gc.collect()
我使用了這篇文章中的一個函式來獲取 100 次迭代前后字典的大小。原字典為9GB,大小增加了約13MB,而從htop開始使用的記憶體增加了10GB。該腳本應該讀入大約 70K 個檔案。
有人可以幫助我解決導致記憶體泄漏的原因以及可能的解決方案嗎?
uj5u.com熱心網友回復:
當您呼叫array = output[:,1]numpy 時,只會創建一個視圖。這意味著它保留對整體(可能很大)的參考output以及array僅作為第一列的資訊。現在你保存這個參考dic意味著仍然存在對整個輸出的參考并且垃圾收集器無法釋放記憶體。
要解決此問題,只需指示 numpy 它應該創建一個副本:
array = output[:,1].copy()
這樣陣列將包含它自己的資料副本(這比創建視圖慢),但關鍵是一旦你洗掉了output(明確地通過del output或在下一次迭代中覆寫它),就不再有對輸出,記憶體將被釋放。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/329506.html
