Teilen Sie große Dateien mit Python

7

Ich habe Probleme, große Dateien zu teilen (etwa 10 GB). Die Grundidee ist einfach die Zeilen zu lesen und alle, sagen wir 40000 Zeilen in eine Datei zu gruppieren. Aber es gibt zwei Möglichkeiten, Dateien zu "lesen".

1) Die erste lautet, die WHOLE-Datei auf einmal zu lesen und sie in eine LISTE umzuwandeln. Dies erfordert jedoch das Laden der WHOLE-Datei in den Speicher, was für die zu große Datei schmerzhaft ist. (Ich glaube, ich habe solche Fragen schon mal gestellt) In python, Ansätze zum Lesen der gesamten Datei auf einmal habe ich versucht, einschließlich:

%Vor%

Nun, dann kann ich einfach 40000 Zeilen in eine Datei gruppieren: list[40000,80000] or list[80000,120000] Oder der Vorteil der Verwendung von Liste ist, dass wir leicht auf bestimmte Zeilen zeigen können.

2) Die zweite Möglichkeit besteht darin, Zeile für Zeile zu lesen; Verarbeite die Linie beim Lesen. Diese Leseleitungen werden nicht gespeichert. Beispiele umfassen:

%Vor%

oder

%Vor%

Ich bin sicher für gzip.open, das f ist keine Liste, sondern ein Dateiobjekt. Und anscheinend können wir nur Zeile für Zeile verarbeiten; wie kann ich diesen "Split" Job ausführen? Wie kann ich auf bestimmte Zeilen des Dateiobjekts zeigen?

Danke

    
quelle

5 Antworten

11
%Vor%     
yurib 11.11.2011, 16:08
quelle
4

Wenn es nichts Besonderes ist, eine bestimmte Anzahl von Dateizeilen in jeder Datei zu haben, readlines() function akzeptiert auch einen Größenhinweisparameter, der sich wie folgt verhält:

  

Wenn ein optionaler Parameter sizehint angegeben wird, liest er so viele Bytes aus   die Datei und genug mehr, um eine Zeile zu vervollständigen, und gibt die Zeilen zurück   davon. Dies wird oft verwendet, um ein effizientes Lesen eines großen zu ermöglichen   Datei für Zeile, aber ohne die gesamte Datei im Speicher zu laden.   Nur vollständige Zeilen werden zurückgegeben.

... damit du den Code so schreiben kannst:

%Vor%     
bgporter 11.11.2011 16:17
quelle
3
%Vor%     
Jason Sundram 11.11.2011 16:15
quelle
2

Für eine 10-GB-Datei ist der zweite Ansatz eindeutig der richtige Weg. Hier ist ein Überblick darüber, was Sie tun müssen:

  1. Öffnen Sie die Eingabedatei.
  2. Öffnen Sie die erste Ausgabedatei.
  3. Lesen Sie eine Zeile aus der Eingabedatei und schreiben Sie sie in die Ausgabedatei.
  4. Pflegen Sie die Anzahl der Zeilen, die Sie in die aktuelle Ausgabedatei geschrieben haben. sobald es 40000 erreicht, schließe die Ausgabedatei und öffne die nächste.
  5. Wiederholen Sie die Schritte 3-4, bis Sie das Ende der Eingabedatei erreicht haben.
  6. Schließen Sie beide Dateien.
NPE 11.11.2011 16:07
quelle
0

Wenn Sie an der Datei arbeiten, müssen Sie natürlich den Inhalt der Datei in irgendeiner Weise durchlaufen - egal, ob Sie das manuell tun oder einen Teil der Python-API für Sie verwenden (z. B. die Readlines) () Methode) ist nicht wichtig. In der großen O-Analyse bedeutet dies, dass Sie die O (n) -Zeit ausgeben (n ist die Größe der Datei).

Aber das Lesen der Datei in den Speicher erfordert auch O (n) Leerzeichen. Obwohl wir manchmal eine 10-GB-Datei in den Speicher schreiben müssen, ist dies bei Ihrem speziellen Problem nicht erforderlich. Wir können direkt über das Dateiobjekt iterieren. Natürlich benötigt das Dateiobjekt Platz, aber wir haben keinen Grund, den Inhalt der Datei zweimal in zwei verschiedenen Formen zu halten.

Deshalb würde ich mit Ihrer zweiten Lösung gehen.

    
Josh Imhoff 11.11.2011 17:24
quelle

Tags und Links