2 Stimmen

"MemoryError" bei Multithread-Txt-Datei-E/As, Suche nach einer besseren Lösung

Ich arbeite nur mit einer txt-Datei, die etwa 4 MB groß ist, und die Datei benötigt häufig E/A, wie z. B. neue Zeilen anhängen/nach bestimmten Zeilen suchen, die bestimmte Ausdrücke enthalten/eine bestimmte Zeile durch eine andere ersetzen usw.

Um die Datei "gleichzeitig" zu bearbeiten, threading.RLock() wird verwendet, um die Ressource zu sperren, wenn sie in Betrieb ist. Da es sich nicht um eine große Datei handelt, verwende ich einfach readlines() um sie alle in eine Liste einzulesen und den Suchauftrag zu erfüllen, und auch mit read() um die gesamte Datei in eine Zeichenkette einzulesen FileContent und verwenden FileContent.replace("demo", "test") um bestimmte Begriffe durch beliebige Begriffe zu ersetzen.

Aber das Problem ist, ich bin gelegentlich mit "MemoryError", ich meine manchmal alle 3 oder 4 Tage, manchmal länger wie eine Woche oder so. Ich habe meinen Code sorgfältig überprüft und es gibt kein ungeschlossenes Dateiobjekt, wenn jeder Thread endet. Was die Datei-Operation betrifft, verwende ich einfach:

CurrentFile = open("TestFile.txt", "r")
FileContent = CurrentFile.read()
CurrentFile.close()

Ich denke, vielleicht Python ist nicht löschen nutzlose Variablen so schnell wie ich erwartet, die schließlich Ergebnis in aus dem Speicher, so dass ich erwäge, zu verwenden with Anweisung, die beim Garbage Collecting schnell sein kann. Ich habe keine Erfahrung mit solchen Anweisungen, weiß jemand, ob dies helfen würde? Oder gibt es eine bessere Lösung für mein Problem?

Herzlichen Dank.

Hinzugefügt: Mein Skript würde viele Ersetzungen in kurzer Zeit durchführen, so dass ich vermute, dass vielleicht Hunderte von Threads, die FileContent = CurrentFile.read() verwenden, zu Speichermangel führen würden, wenn FileContent nicht schnell gelöscht wird? Wie kann ich ein solches Problem beheben?

1voto

Ned Batchelder Punkte 342778

Ohne mehr von Ihrem Code zu sehen, ist es unmöglich zu wissen, warum Ihnen der Speicher ausgeht. Die with Anweisung ist der bevorzugte Weg, um Dateien zu öffnen und zu schließen, wenn sie fertig sind:

with open("TestFile.txt", "r") as current_file:
    file_content = current_file.read()

(sorry, UpperCamelCase für Variablen sieht für mich einfach nicht richtig aus...)

Ehrlich gesagt, bezweifle ich, dass dies Ihr Problem lösen wird, wenn Sie wirklich Dateien schließen, wie Sie in der Frage zeigen, aber es ist trotzdem eine gute Übung.

0voto

Mikko Ohtamaa Punkte 75407

Klingt, als ob Sie Speicherverluste haben. Python verwendet den gesamten verfügbaren Systemspeicher, bevor es einen MemoryError ausgibt, und 4 MB klingt nicht viel. Wo Sie Speicher lecken, hängt von Ihrem Code ab, den Sie in Ihrer Frage nicht angegeben haben.

Haben Sie den Speicherverbrauch in der Taskverwaltung des Betriebssystems beobachtet?

Hier ist ein Tool zum Debuggen des Python-Speicherverbrauchs (benötigt Python-Debug-Kompilierung):

http://guppy-pe.sourceforge.net/#Heapy

Verwenden Sie es, um die Speichernutzung Ihres Codes zu analysieren und zu sehen, welche Objekte Sie erstellen, die nicht freigegeben werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X