我是python的新手,所以我很抱歉,如果這個例子很簡單。存儲已保存的列表時出現Python MemoryError
我想寫一個簡單的腳本,將兩個大型數據文件(每個〜40GB)的部分分別提取到一個生成的文件中,格式略有變化。我最初嘗試使用readlines(),但是將所有文件讀入內存,而我們的實例只有28GB內存。使用sizehint參數僅解析文件的一部分。
我現在迭代該文件。問題是我將文本解析的輸出存儲在三個列表中,這些列表變得相當大,超出了可用內存。我認爲這只是切換到使用交換,這將是很好,但它只是退出與「MemoryError」。
這適用於小樣本文件,但扼流圈對我們的實際數據。
腳本:
import sys
a = []
b = []
c = []
file1 = open(sys.argv[1],"r")
for line in file1:
if '@' in line:
a.append(line.lstrip('@').rstrip('\n'))
b.append(file1.next().rstrip('\n'))
file1.close()
file2 = open(sys.argv[2],"r")
for line in file2:
if '@' in line:
c.append(file2.next().rstrip('\n'))
file2.close()
file3 = open(sys.argv[3],"w")
for i in xrange(len(a)):
file3.write("".join([">",a[i],'\n',b[i],":",c[i],"\n"]))
我在網上發現表明創造某種數據庫來存儲變量的,但不應該是必要的。你有什麼想法,我應該如何處理這個?
爲了完整,這就是我想要做的(從我們的例子中的測試數據:
file1:
@Read.Salmonella_paratyphi_A_chromosome.29004.4835/1
TCGTGTACAGCATTCTTTATAGTGGAACGGTGACCGTACCGCAAAGCTGCGAAATCAACGCCGGACKIPPTCGTAG
+
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
file2:
@Read.Salmonella_paratyphi_A_chromosome.29004.4835/1
TCGTGTACAGCATTCTTTATAGTGGAACGGTGACCGTACCGCAAAGCTGCGAAATCAACGCCGGACAAACGATTCT
+
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
file3 (output):
>Read.Salmonella_paratyphi_A_chromosome.29004.4835/1
TCGTGTACAGCATTCTTTATAGTGGAACGGTGACCGTACCGCAAAGCTGCGAAATCAACGCCGGACKIPPTCGTAG:TCGTGTACAGCATTCTTTATAGTGGAACGGTGACCGTACCGCAAAGCTGCGAAATCAACGCCGGACAAACGATTCT
數據庫解決方案將最有意義的,因爲你只是用了太多的內存。它可能被推動交換,但你不能依賴這種行爲。將中間結果存儲在磁盤上的文件中會讓您更有效地利用空間,而不是試圖將所有內容都放在內存中。 – sean 2012-07-16 16:34:47
謝謝。我想過試圖做到這一點,但是當我得到三個結果列表然後不得不連接它們時,我會不會遇到同樣的內存錯誤? – Kipp 2012-07-16 16:35:56
列表b從第一個文件輸出,列表c從第二個文件輸出。他們從兩個文件中的同一地點獲取數據,但數據不同。編輯:哦,我犯了一個錯字。它們來自不同的sys.argv [x]輸入。現在修復它。 – Kipp 2012-07-16 16:45:18