Sortieren Sie große CSV-Dateien (90 GB). Das Festplattenkontingent wurde überschritten

7

Folgendes mache ich gerade:

sort -T /some_dir/ --parallel=4 -uo file_sort.csv -k 1,3 file_unsort.csv

Die Datei ist 90 GB, ich habe diese Fehlermeldung erhalten

sort: close failed: /some_dir/sortmdWWn4: Disk quota exceeded

Bisher habe ich die Option -T nicht verwendet und anscheinend ist das tmp-Verzeichnis nicht groß genug, um dies zu handhaben. Mein aktuelles Verzeichnis hat freien Speicherplatz von ungefähr 200 GB. Reicht es immer noch nicht für die temporäre Sortierdatei?

Ich weiß nicht, ob die parallele Option die Dinge beeinflusst oder nicht.

Xuezhou Zhang
quelle
5
Sie scheinen ein Quotensystem eingerichtet zu haben. Wie viel von diesen 200 GB steht Ihnen tatsächlich zur Verfügung? Ihre Fehlermeldung weist darauf hin, dass Ihr Benutzer den Speicherplatz, den Sie verwenden dürfen, begrenzt.
Terdon
$HOME/tmp
Beachten Sie
@terdon Das könnte der Grund sein. Ich habe mein Kontingent überprüft und nur 100 GB erhalten. Kannst du das glauben? Ich werde ein ernstes Gespräch mit meinem Administrator führen. Danke noch einmal.
Xuezhou Zhang
Auf einem System, das 200 GB frei hat und offensichtlich ein Mehrbenutzersystem ist? Ja, das kann ich natürlich glauben! Machst du Witze? Sie haben volle 50% des verfügbaren Platzes nur für Sie! Oh, und welches Betriebssystem verwenden Sie? Wenn Sie Zugriff auf GNU haben sort, habe ich möglicherweise eine Problemumgehung für Sie.
Terdon
LOL, ok, ich bin kein System-Typ, aber ich glaube nicht, dass der gesamte Server nur 200 GB freien Speicherplatz hat. Ich denke, das ist freier Speicherplatz meiner afs, aber ich kann nur 50% meines zugewiesenen Speicherplatzes nutzen? Das ist seltsam.
Xuezhou Zhang

Antworten:

5

Das Problem ist, dass Sie anscheinend ein Festplattenkontingent eingerichtet haben und Ihr Benutzer nicht das Recht hat, so viel Speicherplatz in Anspruch zu nehmen /some_dir. Und nein, die --parallelOption sollte dies nicht beeinflussen.

Um dieses Problem zu umgehen, können Sie die Datei in kleinere Dateien aufteilen, diese einzeln sortieren und sie dann wieder zu einer einzigen Datei zusammenführen:

## split the file into 100M pieces named fileChunkNNNN
split -b100M file fileChunk
## Sort each of the pieces and delete the unsorted one
for f in fileChunk*; do sort "$f" > "$f".sorted && rm "$f"; done
## merge the sorted files    
sort -T /some_dir/ --parallel=4 -muo file_sort.csv -k 1,3 fileChunk*.sorted

Die Magie ist die -mOption von GNU sort (von info sort):

‘-m’
‘--merge’
    Merge the given files by sorting them as a group.  Each input file
    must always be individually sorted.  It always works to sort
    instead of merge; merging is provided because it is faster, in the
    case where it works.

Dazu müssen Sie ~ 180G für eine 90G-Datei frei haben, um alle Teile speichern zu können. Die eigentliche Sortierung nimmt jedoch nicht so viel Platz ein, da Sie nur in 100 Millionen Blöcken sortieren werden.

terdon
quelle
Das scheint zu funktionieren. Ich werde es versuchen. Tatsächlich muss ich zwei 90-GB-Dateien sortieren, und dann muss ich sie unterscheiden ... Irgendeine Idee zum Diff-Teil?
Xuezhou Zhang
@XuezhouZhang nicht ohne weitere Details, nein. Ich schlage vor, Sie stellen eine neue Frage. Stellen Sie sicher, dass Sie klarstellen, ob Sie die Unterschiede kennen müssen oder ob Sie nur wissen müssen, ob die Dateien unterschiedlich sind, aber es ist Ihnen egal, wie oder warum.
Terdon
Hat -bhonorus Linien, also auf rund Chunkgrößen auf Zeilenumbrüche aufgeteilt? Ich kann nichts in sehen man split, ich bin besorgt, ob es tragbare Erwartung in Richtung Split Regaring geben kann, ohne Linien in der Mitte zu brechen
Grzegorz Wierzowiecki
@GrzegorzWierzowiecki Ich nehme das an. sortFunktioniert standardmäßig mit Zeilen. Das gesamte Konzept der Sortierung basiert auf dem Sortieren von Zeilen . Daher müssen hier die Zeilengrenzen berücksichtigt werden. Ich habe den Quellcode nicht überprüft, aber es ist das einzige, was Sinn macht.
Terdon