Wie löst man das memory error in Python
Beschäftige ich mich mit mehreren großen txt-Datei, jeder von Ihnen hat über 8000000 Linien. Ein kurzes Beispiel die Zeilen:
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
Den code zu speichern Sie Sie in einem Wörterbuch ist:
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)
Es gut läuft in der ersten txt-Datei, aber wenn es läuft auf die zweite txt-Datei, ich bekam eine Fehlermeldung MemoryError
.
Ich bin mit Windows 7 64bit mit python 2.7 32bit, intel i5 cpu mit 8 GB Speicher. Wie kann ich das problem lösen?
Weiter zu erklären:
Ich habe vier große Dateien, jede Datei enthält verschiedene Informationen, die für viele Unternehmen. Zum Beispiel, ich möchte finden Sie alle Informationen für cat
, dessen Vater-Knoten animal
und seine Kind-Knoten persian cat
und so weiter. Also mein Programm Lesen Sie zuerst alle txt-Dateien in das Wörterbuch, dann scan ich alle Wörterbücher, um Informationen für cat
und seinen Vater und seinen Kindern.
Warum brauchen Sie diese Daten in einem Wörterbuch? Legen Sie Sie in eine Datenbank oder einen ähnlichen Speicher, können Sie Abfrage.
Ich Vernachlässigung der input-Prozess in meiner Frage, ich habe gelesen Dateien, und
fin
öffnet die DateiIch muss mehr tun, nachdem ich gelesen habe, Sie im Wörterbuch. Ich brauche Sie also in meinem code.
Dennoch sehe ich nicht alles, was in Ihrer Beschreibung erfordert dies geschieht im Arbeitsspeicher.
InformationsquelleAutor flyingmouse | 2016-05-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einfachste Lösung: Du bist wahrscheinlich der virtuelle Adressraum (jede andere form von Fehler in der Regel bedeutet, läuft wirklich langsam für eine lange Zeit, bevor Sie endlich eine
MemoryError
). Dies ist, weil 32-bit-Anwendung, die auf Windows (und die meisten Betriebssysteme) ist begrenzt auf 2 GB Adressraum für den Benutzermodus (Windows kann optimiert werden, um es 3 GB, aber das ist immer noch ein low-cap). Du hast 8 GB RAM, aber dein Programm nicht verwenden können (mindestens) 3/4. Python hat einen fairen Betrag von pro-Objekt-overhead (Objekt-header, die Zuteilung Ausrichtung, etc.), Chancen sind die Saiten allein, sind Sie in der Nähe ein GB RAM, und das ist, bevor Sie befassen sich mit den Aufwand für das Wörterbuch, der rest des Programms, der rest von Python, etc. Wenn Speicher Fragmente, die genug, und das Wörterbuch braucht, um zu wachsen, kann es nicht genügend zusammenhängenden Speicherplatz zu reservieren, und Sie erhalten eineMemoryError
.Installieren Sie ein 64-bit-version von Python (wenn Sie können, würde ich empfehlen ein Upgrade auf Python 3 aus anderen Gründen); es wird mehr Speicher verwenden, aber dann wird es Zugang zu einem viel mehr Speicher (und mehr RAM).
Wenn das nicht genug ist, betrachten konvertieren in eine
sqlite3
Datenbank (oder eine andere DB), so ist es natürlich schwappt auf die Festplatte, wenn die Daten zu groß für den Hauptspeicher, während immer noch ziemlich effizient-lookup.memory error
nach der Hälfte von meinem Speicher (über 4Gb verwendet wurde). Ich fühle mich seltsam, warum der Fehler passiert, wenn es noch die Hälfte Speicher zur Verfügung.Mit
sqlite3
ist guter Rat teuer.Sie läuft ohne Auslagerungsdatei? Normalerweise, auch wenn Sie haben in der Tat den physischen RAM sollten laufen zu halten (wenn langsamer), bis die Auslagerungsdatei voll ist. Wenn es keine Auslagerungsdatei, dann eine ausreichend große Wörterbuch immer in der Größe verändert schlagen könnte das Problem rund 4 GB, wenn Sie haben genügend Daten, um zu schlagen, dann empfehle ich dringend den Wechsel zu einem DB (a einfaches wie
sqlite3
die Schiffe, wie ein Python-Modul, oder ein stärkeres man wie PostgreSQL, MySQL, etc.).InformationsquelleAutor ShadowRanger
Vorausgesetzt, Ihr Beispiel text ist repräsentativ für den gesamten text, eine Zeile würde verbrauchen etwa 75 bytes auf meinem Rechner:
Dabei einige grobe Mathe:
So in etwa 572 meg zum speichern von Zeichenfolgen, die allein für eine dieser Dateien. Sobald Sie beginnen, indem in weiteren, ähnlich strukturierten und Größe der Dateien, werden Sie schnell gehen Sie auf Ihre virtuellen Adressraum begrenzt, wie bereits in @ShadowRanger Antwort.
Wenn ein Upgrade Ihrer python ist nicht möglich für Sie, oder wenn es nur kicks die kann die Straße hinunter (Sie haben endlichen physischen Speicher, nachdem alle), Sie haben wirklich zwei Optionen: schreiben Sie Ihre Ergebnisse, um temporäre Dateien, die zwischen laden und Lesen der input-Dateien, oder schreiben Sie Ihre Ergebnisse in einer Datenbank. Da müssen Sie weitere post-verarbeiten der strings nach der Aggregation Ihnen das schreiben in eine Datenbank wäre der überlegene Ansatz.
InformationsquelleAutor Levi Noecker