Lesen Sie die Datei in chunks - RAM-Nutzung, Lesen von Zeichenfolgen aus Binärdateien
ich würde gerne verstehen, den Unterschied in der RAM-Nutzung von diese Methoden, die beim Lesen einer großen Datei in python.
Version 1, hier auf stackoverflow:
def read_in_chunks(file_object, chunk_size=1024):
while True:
data = file_object.read(chunk_size)
if not data:
break
yield data
f = open(file, 'rb')
for piece in read_in_chunks(f):
process_data(piece)
f.close()
Version 2, die ich verwendet, bevor ich fand den obigen code:
f = open(file, 'rb')
while True:
piece = f.read(1024)
process_data(piece)
f.close()
Die Datei gelesen wird, die teilweise in beiden Versionen. Und das aktuelle Stück verarbeitet werden konnten. Im zweiten Beispiel piece
wird immer neue Inhalte auf jedem Zyklus, so dass ich dachte, dies würde die Arbeit machen, um nicht laden Sie die komplette Datei in den Speicher..?
Aber ich weiß nicht wirklich verstehen, was yield
tut, und ich bin mir ziemlich sicher, ich habe etwas falsch hier. Könnte jemand erklären, dass mir?
Es ist etwas anderes, das verwirrt mich, neben der Methode verwendet:
Den Inhalt des Stück, das ich lese, ist definiert durch die chunk-Größe, 1 KB, in den obigen Beispielen. Aber... was ist, wenn ich brauchen, um für die strings in der Datei? So etwas wie "ThisIsTheStringILikeToFind"
?
Je nachdem, wo in der Datei die Zeichenfolge Auftritt, könnte es sein, dass die ein Stück enthält, das Teil "ThisIsTheStr"
- und das nächste Stück enthalten würde "ingILikeToFind"
. Unter Verwendung einer solchen Methode ist es nicht möglich, zu erkennen, die gesamte Zeichenfolge in jedem Stück.
Gibt es eine Möglichkeit zum Lesen einer Datei in Stücke - aber irgendwie interessieren solche Saiten?
Jede Hilfe oder Idee ist willkommen,
grüßt!
- Sie schreiben, könnte das erste fragment als
for chunk in iter(partial(f.read, chunk_size), b""): process_data(chunk)
(übernehmen Binär-Modus). Die Antwort auf die Letzte Frage ist ja: prüfen Sie einfach, ob das Stück endet mit beliebigen Zeichenfolge Präfixe und der nächste Abschnitt beginnt mit dem entsprechenden Zusatz. - Danke für die Erwähnung
iter
- wusste nicht, dass! Über die zweite Frage: Du meinst, ich könnte prüfen, ob das Stück endet mitT
oderTh
oderThi
oderThis
- und so weiter? Hmm, nette Idee! Danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
yield
ist das Schlüsselwort in python verwendet für generator-Ausdrücke. Das bedeutet, dass das nächste mal die Funktion aufgerufen wird (oder iterierten) ist die Ausführung beginnt wieder bis genau an dem Punkt es aufgehört hat Letzte mal, dass Sie es nannte. Die beiden Funktionen Funktion identisch; der einzige Unterschied ist, dass die erste benutzt ein kleines bisschen mehr an stack-Speicher als die zweite. Jedoch, das erste ist weit mehr wiederverwendbar, so dass von einer Programm-design-Standpunkt aus, die erste ist wirklich besser.EDIT: Auch ein weiterer Unterschied ist, dass der erste mit dem Lesen aufhören, sobald alle Daten gelesen wurden, wie es soll, aber die zweite wird nur beendet, wenn entweder
f.read()
oderprocess_data()
eine exception wirft. Um die zweite korrekt funktioniert, müssen Sie es ändern, etwa so:return
nur der erste Teil der Datei und diefor
-loop-Zyklus würde durch die Daten derpiece
ohneyield
?