[英]How to solve the memory error in Python
我正在處理幾個大的 txt 文件,每個文件大約有 8000000 行。 這些行的一個簡短示例是:
usedfor zipper fasten_coat
usedfor zipper fasten_jacket
usedfor zipper fasten_pant
usedfor your_foot walk
atlocation camera cupboard
atlocation camera drawer
atlocation camera house
relatedto more plenty
將它們存儲在字典中的代碼是:
dicCSK = collections.defaultdict(list)
for line in finCSK:
line=line.strip('\n')
try:
r, c1, c2 = line.split(" ")
except ValueError:
print line
dicCSK[c1].append(r+" "+c2)
它在第一個 txt 文件中運行良好,但是當它運行到第二個 txt 文件時,出現錯誤MemoryError
。
我正在使用 windows 7 64bit 和 python 2.7 32bit,intel i5 cpu,8Gb 內存。 我該如何解決問題?
進一步解釋:我有四個大文件,每個文件包含許多實體的不同信息。 例如,我想找到cat
所有信息,它的父節點animal
和它的子節點persian cat
等等。 所以我的程序首先讀取字典中的所有 txt 文件,然后我掃描所有字典以查找cat
及其父親和孩子的信息。
最簡單的解決方案:您可能已經用完了虛擬地址空間(任何其他形式的錯誤通常意味着在您最終得到MemoryError
之前運行很慢很長時間)。 這是因為 Windows(和大多數操作系統)上的 32 位應用程序被限制為 2 GB 的用戶模式地址空間(Windows 可以調整為 3 GB,但這仍然是一個低上限)。 您有 8 GB 的 RAM,但您的程序無法使用(至少)其中的 3/4。 Python 有相當多的每個對象開銷(對象頭、分配對齊等),很可能僅字符串就使用了接近 1 GB 的 RAM,這是在處理字典開銷之前,其余的你的程序、Python 的其余部分等等。如果內存空間碎片足夠多,並且字典需要增長,它可能沒有足夠的連續空間來重新分配,你會得到一個MemoryError
。
安裝 64 位版本的 Python(如果可以,我建議出於其他原因升級到 Python 3); 它會使用更多的內存,但隨后,這將有機會獲得更大量的存儲空間(並物理RAM以及)。
如果這還不夠,請考慮轉換為sqlite3
數據庫(或其他一些數據庫),這樣當數據對於主內存來說太大時它自然會溢出到磁盤,同時仍然具有相當有效的查找。
假設您的示例文本代表所有文本,一行在我的機器上將消耗大約 75 個字節:
In [3]: sys.getsizeof('usedfor zipper fasten_coat')
Out[3]: 75
做一些粗略的數學運算:
75 bytes * 8,000,000 lines / 1024 / 1024 = ~572 MB
所以大約 572 meg 單獨存儲這些文件之一的字符串。 一旦開始添加額外的、結構和大小相似的文件,您將很快接近虛擬地址空間限制,如@ShadowRanger 的回答中所述。
如果升級你的python對你來說不可行,或者如果它只是在路上(畢竟你的物理內存有限),你真的有兩個選擇:將你的結果寫入加載和讀取之間的臨時文件輸入文件,或將結果寫入數據庫。 由於您需要在聚合字符串后進一步對字符串進行后處理,因此寫入數據庫將是更好的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.