我必須閱讀大約300個文件才能創建與以下代碼段的關聯。鑑於這種關聯,我必須在記憶中閱讀它們。提高以下python代碼的效率(內存/時間)
with util.open_input_file(f) as f_in:
for l in f_in:
w = l.split(',')
dfm = dk.to_key((idx, i, int(w[0]), int(w[1]))) <-- guaranteed to be unique for each line in file.
cands = w[2].split(':')
for cand in cands:
tmp_data.setdefault(cand, []).append(dfm)
然後我需要這種格式上面寫出來的數據結構:
k1, v1:v2,v3....
k2, v2:v5,v6...
我使用以下代碼:
# Sort/join values.
cand2dfm_data = {}
for k,v in tmp_data.items():
cand2dfm_data[k] = ':'.join(map(str, sorted(v, key=int)))
tmp_data = {}
# Write cand2dfm CSV file.
with util.open_output_file(cand2dfm_file) as f_out:
for k in sorted(cand2dfm_data.keys()):
f_out.write('%s,%s\n' % (k, cand2dfm_data[k]))
由於我必須處理的顯著數文件,我正在觀察兩個問題:
用於存儲的內存tmp_data非常大。在我的使用情況下,處理300個文件,它使用42GB。
寫出CSV文件需要很長時間。這是因爲我在每個項目()(約2.2M)上調用write()。此外,輸出流使用gzip壓縮器來節省磁盤空間。
在我的使用情況下,數字保證是32位無符號。
問:
爲了實現內存減少,我認爲這將是最好使用一個32位int來存儲數據。我應該使用ctypes.c_int()將值存儲在dict()(現在它們是字符串)還是有更好的方法?
爲了加速寫入,我應該寫入一個StringIO對象,然後將其轉儲到一個文件或有更好的方法嗎?
或者,也許有更好的方法來完成上述邏輯而不讀取內存中的所有內容?
如果你的代碼運行沒有錯誤,一個更好的地方可以問[codereview.se]。 – usr2564301