簡體   English   中英

如何解決Python中的內存錯誤

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

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