foobar schrieb:
> Sparsamer: jedes File sortieren und dann mergen:
> for i in *.txt; do sort -u "$i" >"$i.sorted"; done
> sort -m -u *.sorted >out.txt
>
> (Nur runtergetippt, nicht getestet)
Dein Vorschlag gefällt mir sehr gut, vor allem für Rechner mit schwacher
RAM-Ausstattung. Ich habe ihn mal auf meinem Rechner mit 6GB RAM
ausprobiert:
Dazu habe ich 3000 Dateien mit je 100000 Zeilen mit je 50 zufälligen
Ziffern generiert. sort verarbeitet im Merge-Modus defaultmäßig nur
bis zu 16 Eingabedateien gleichzeitig, bei einer größeren Anzahl werden
sie in 16er-Gruppen in Temporärdateien gemerget, und das so lange, bis
am Ende nur noch eine einzelne Datei übrig bleibt. Die Temporärdateien
haben erst einmal mein /tmp-Verzeichni (RAM-Disk mit 2,9G) gesprengt.
Man kann das Limit mit --batch-size von 16 auf 3000 erhöhen, stößt dann
aber auf ein weiteres Limit von 1024 Dateien pro Prozess. Dieses kann
man mit prlimit ebenfalls erhöhen, so dass der Befehl für das Mergen
ohne Temporärdateien so lautet:
1 | prlimit -n3003 sort -mu --batch-size=3000 *.sorted > out.txt
|
Beides zusammen (Sortieren der 3000 Einzeldateien und Mergen) hat bei
mir auf einer mechanischen Festplatte eine knappe halbe Stunde gedauert.