Ändern Sie die Python-Datei an Ort und Stelle

8

Ich habe eine große XML-Datei (40 GB), die ich in kleinere Stücke aufteilen muss. Ich arbeite mit begrenztem Speicherplatz, also gibt es eine Möglichkeit, Zeilen aus der ursprünglichen Datei zu löschen, während ich sie in neue Dateien schreibe?

Danke!

    
Maulin 17.07.2009, 19:41
quelle

7 Antworten

7

Sagen wir, Sie möchten die Datei in N Teile aufteilen, dann fangen Sie einfach an, von der Rückseite der Datei zu lesen (mehr oder weniger) und rufen Sie wiederholt truncate :

  

Kürzen Sie die Dateigröße. Wenn das optionale Size-Argument vorhanden ist, wird die Datei auf (höchstens) diese Größe abgeschnitten. Die Größe entspricht standardmäßig der aktuellen Position. Die aktuelle Dateiposition wird nicht geändert. ...

%Vor%

Sei vorsichtig, denn ich habe das nicht getestet. Es kann erforderlich sein, flush nach dem Aufruf von truncate aufzurufen, und ich weiß nicht, wie schnell das Dateisystem tatsächlich den Speicherplatz freigibt.

    
Torsten Marek 17.07.2009, 20:11
quelle
2

Wenn Sie unter Linux / Unix arbeiten, verwenden Sie den Befehl split wie dieser Typ tut das?

%Vor%

BEARBEITEN: Verwenden Sie dann csplit .

    
plastic chris 17.07.2009 19:53
quelle
1

Ich bin mir ziemlich sicher, dass es da ist, da ich sogar in der Lage bin, die Quelldateien von Skripten zu bearbeiten / zu lesen, aber das größte Problem wäre wahrscheinlich die Verschiebung, die man beim Start machen würde am Anfang der Datei. Wenn Sie andererseits die Datei durchlaufen und alle Anfangspositionen der Zeilen aufzeichnen, können Sie in umgekehrter Reihenfolge der Position gehen, um die Zeilen zu kopieren. Wenn das erledigt ist, kannst du zurückgehen, die neuen Dateien nacheinander aufnehmen und (wenn sie klein genug sind) mit readlines () eine Liste erstellen, die Reihenfolge der Liste umkehren und dann zum Anfang suchen der Datei und überschreiben die Zeilen in ihrer alten Reihenfolge mit den Zeilen in ihrer neuen.

(Sie würden die Datei nach dem Lesen des ersten Zeilenblocks vom Ende abschneiden, indem Sie die Methode truncate() verwenden, die alle Daten jenseits der aktuellen Dateiposition abschneidet, wenn sie ohne Argumente außer dem des Dateiobjekts verwendet wird Verwenden Sie eine der Klassen oder eine Unterklasse einer der Klassen aus dem Paket io , um Ihre Datei zu lesen.Sie müssen nur sicherstellen, dass die aktuelle Dateiposition am Anfang der letzten Zeile endet in eine neue Datei geschrieben.)

BEARBEITEN: Aufgrund Ihres Kommentars, dass Sie die Trennungen an den richtigen schließenden Tags vornehmen müssen, müssen Sie wahrscheinlich auch einen Algorithmus entwickeln, um solche Tags zu erkennen (möglicherweise mithilfe der peek -Methode), möglicherweise unter Verwendung eines regulären Ausdrucks .

    
JAB 17.07.2009 19:51
quelle
0

Wenn die Zeit kein Hauptfaktor ist (oder Verschleiß an der Festplatte):

  1. Öffnen Sie den Handle für die Datei
  2. Lesen Sie bis zur Größe Ihrer Partition / logischen Unterbrechungspunkt (aufgrund der XML)
  3. Speichern Sie den Rest Ihrer Datei auf dem Datenträger (ich bin mir nicht sicher, wie Python das handhabt, wenn Sie die Datei- oder Speicherbelegung direkt überschreiben)
  4. Schreiben Sie die Partition auf die Festplatte
  5. gehe zu 1

Wenn Python dir diese Kontrolle nicht gibt, musst du vielleicht in C eintauchen.

    
Jesse Vogt 17.07.2009 19:53
quelle
0

Sie könnten die XML-Datei immer parsen und alle 10000 Elemente in eine eigene Datei schreiben. Sehen Sie sich den Abschnitt Inkrementelle Analyse dieses Links an. Ссылка

    
Jared 17.07.2009 20:06
quelle
0

Hier ist mein Skript ...

%Vor%     
Maulin 20.07.2009 15:07
quelle
-1

Es ist eine Zeit, eine neue Festplatte zu kaufen!

Sie können eine Sicherungskopie erstellen, bevor Sie alle anderen Antworten ausprobieren und keine Daten verloren gehen:)

    
Denis Barmenkov 18.07.2009 21:25
quelle

Tags und Links