Raketendemonstrator: PHP: Grosse Datei zeilenweise behandeln

Beitrag lesen

Eine Alternative wäre, die Eingabedatei zu teilen, sofern das fachlich möglich ist. Zum Beispiel mit einem Aufteilscript in 100000 Zeilenblöcke

Wer ein leistungsfähiges System hat kann das Schritt für Schritt probieren (Bitte erst alles lesen und über die Hardware und den freienSpeicherplatz nachdenken):

So kann man eine Datei mit 100 Millionen Zeilen erzeugen :

for i in {1..100000000}; do echo $i >> /tmp/zeilen; done

... welche auch eine „attraktive Größe“ hat:

ls -lh /tmp/zeilen
-rw-rw-r-- 1 fastix fastix 848M Feb 10 10:58 /tmp/zeilen

Zerlegen:

Man erzeuge ein temporäres Verzeichnis und wechsle geich hinein:

cd $(mktemp -d)
# eg. /tmp/tmp.JEmaiJh5UX$

... und zerlege die Datei in Stücke a 1000 Zeilen, welche als part.NNNNNNNN (-d -a 8) gespeichert werden:

time split -l 1000 -da 8 /tmp/zeilen part.

Das geht auf schnellen Geräten (Partitionen!) auch schnell:

real	0m5,870s
user	0m0,686s
sys	0m4,837s

vom Inhalt der einzelnen Dateien kann man sich wie folgt überzeugen:

less part.00000000
...
less part.00099999

Auf weniger leistungsfähigen Systemen nehme man eine kleinere Datei mit z.B. nur 1 Mio Zeilen. (erster Schritt)

Hint:

Um die beachtliche Anzahl von Dateien loszuwerden lösche man entweder das Verzeichnis:

rm -r /tmp/tmp.JEmaiJh5UX

oder die Dateien in einer Schleife:

for f in *; do rm $f; done

letzteres dauert deutlich länger.

Nicht vergessen, die Datei zu löschen:

rm /tmp/zeilen

Handbuch:

man split oder Ubuntuusers.de->split