Wie werden 40 TB Daten dedupliziert?

17

Ich habe einen Forschungscluster mit ca. 40 TB Daten in drei Dateisystemen geerbt. Die Daten reichen fast 15 Jahre zurück und es gibt höchstwahrscheinlich eine große Anzahl von Duplikaten, da die Forscher die Daten aus unterschiedlichen Gründen gegenseitig kopieren und sich dann einfach an den Kopien festhalten.

Ich kenne De-Duping-Tools wie fdupes und rmlint. Ich versuche, eine zu finden, die auf einem so großen Datensatz funktioniert. Es ist mir egal, ob es Wochen (oder sogar Monate) dauert, bis alle Daten gecrawlt sind - wahrscheinlich werde ich es trotzdem drosseln, um die Dateisysteme zu schonen. Aber ich muss ein Tool finden, das entweder sehr effizient mit RAM arbeitet oder alle erforderlichen Zwischendaten in Dateien und nicht in RAM speichert. Ich gehe davon aus, dass mein RAM (64 GB) erschöpft ist, wenn ich alle diese Daten als einen Satz durchsuche.

Ich experimentiere jetzt mit fdupes auf einem 900GB Baum. Es sind 25% des gesamten Arbeitsspeichers belegt und die RAM-Auslastung hat sich die ganze Zeit langsam erhöht, jetzt sind es 700 MB.

Oder gibt es eine Möglichkeit, einen Prozess so zu steuern, dass festplattenzugeordneter RAM verwendet wird, sodass viel mehr zur Verfügung steht und kein System-RAM verwendet wird?

Ich verwende CentOS 6.

Michael Stauffer
quelle
Die Dateisysteme sind XFS, falls dies relevant ist. Das heißt, ich weiß, es ist kein FS mit De-Duping-Fähigkeiten wie XFS.
Michael Stauffer
Warum machst du dir überhaupt Sorgen um RAM? Das Betriebssystem verfügt über eigene Speicherverwaltungsalgorithmen, und die Tatsache, dass die RAM-Auslastung immer weiter zunimmt, bedeutet nicht, dass letztendlich der gesamte RAM-Speicher aufgebraucht wird. Ich bin mir ziemlich sicher, dass es nicht passieren wird.
Art Gertner
1
Ich weiß nicht, wie dedizierte Tools funktionieren, aber Sie können Hash für jede Datei berechnen und zusammen mit dem Dateipfad protokollieren, dann nach Hashes sortieren und deduplizieren. Dies sollte mit einem einfachen Python-Skript oder sogar in Bash möglich sein. Die RAM-Auslastung sollte mit Ausnahme des Sortierschritts minimal sein, aber ich vermute, Sie könnten eine Art modifiziertes Mergesort verwenden, um sie einigermaßen niedrig zu halten.
Gronostaj
1
Ja, dediziertes Tool zum Berechnen von Hashes, aber zuerst sollten Sie die Dateigröße und nur den Dateianfang prüfen, um die Anzahl der zu berechnenden vollständigen Hashes zu begrenzen.
Michael Stauffer
Was den Arbeitsspeicher betrifft, war ich besorgt darüber, den Dateiserver zu verlangsamen - siehe meinen Kommentar unter der Antwort.
Michael Stauffer

Antworten:

4

Oder gibt es eine Möglichkeit, einen Prozess so zu steuern, dass festplattenzugeordneter RAM verwendet wird, sodass viel mehr zur Verfügung steht und kein System-RAM verwendet wird?

Ja, es heißt das Swap-Laufwerk. Sie haben wahrscheinlich schon eine. Wenn Sie befürchten, dass nicht mehr genügend RAM zur Verfügung steht, ist dies ein guter Anfang. Es funktioniert jedoch automatisch, sodass Sie nichts Besonderes tun müssen.

Ich würde mir keine Sorgen um fdupes machen. Probieren Sie es aus, es sollte ohne Probleme funktionieren.

krowe
quelle
Ich dachte, dass das Verlassen auf Tausch das ganze System verlangsamen würde - es ist ein ausgelasteter Dateiserver. Aber vielleicht nicht genug, um sich Sorgen zu machen? Ich könnte ulimit verwenden, um zu verhindern, dass der Prozess auf jeden Fall mehr als einen System-RAM als Ausfallsicherheit verwendet. Aber anscheinend glauben krowe und smc nicht, dass fdupes sowieso so viel RAM verwenden würden, also sollte ich es einfach versuchen.
Michael Stauffer
1

Das Finden von Duplikaten basierend auf Hashkey funktioniert gut und ist sehr schnell.

find -not -empty -type f -printf "%s\n" | sort -rn | uniq -d | xargs -I{} -n1 find -type f -size {}c -print0 | xargs -0 md5sum | sort | uniq -w32 --all-repeated=separate
kumar
quelle
0

Schreiben Sie eine schnelle App, um durch die Bäume zu gehen, indem Sie entweder (Hash, Mtime) => Dateipfad in ein Wörterbuch drücken oder die Datei zum Löschen markieren, wenn der Eintrag bereits vorhanden ist. Der Hash wird nur ein MD5 sein, der über die ersten N Bytes berechnet wird. Sie könnten ein paar verschiedene Durchgänge machen, mit einem Hash über einem kleinen N und einem weiteren mit einem Hash über einem großen N.

Sie könnten dies wahrscheinlich in weniger als zwanzig oder dreißig Zeilen Python tun (mit os.walk ()).

Dustin Oprea
quelle