Comment dédupliquer 40 To de données?

17

J'ai hérité d'un cluster de recherche avec environ 40 To de données sur trois systèmes de fichiers. Les données remontent à près de 15 ans, et il y a très probablement une bonne quantité de doublons alors que les chercheurs se copient les données pour différentes raisons, puis s'accrochent aux copies.

Je connais les outils de déduplication comme fdupes et rmlint. J'essaie d'en trouver un qui fonctionnera sur un si grand ensemble de données. Je me fiche que cela prenne des semaines (ou peut-être même des mois) pour explorer toutes les données - je vais probablement les limiter de toute façon pour aller doucement sur les systèmes de fichiers. Mais je dois trouver un outil qui est en quelque sorte super efficace avec la RAM, ou qui peut stocker toutes les données intermédiaires dont il a besoin dans des fichiers plutôt que de la RAM. Je suppose que ma RAM (64 Go) sera épuisée si j'explore toutes ces données en un seul ensemble.

J'expérimente avec fdupes maintenant sur une arborescence de 900 Go. C'est 25% du chemin à parcourir et l'utilisation de la RAM a lentement augmenté tout le temps, maintenant elle est à 700 Mo.

Ou, existe-t-il un moyen de diriger un processus pour utiliser la RAM mappée sur disque afin qu'il y ait beaucoup plus disponible et qu'il n'utilise pas de RAM système?

J'utilise CentOS 6.

Michael Stauffer
la source
Les systèmes de fichiers sont XFS, au cas où cela serait pertinent. Autrement dit, je sais que ce n'est pas un fs avec des capacités de déduplication comme XFS.
Michael Stauffer
pourquoi vous inquiétez-vous de la RAM en premier lieu? Le système d'exploitation a ses propres algorithmes de gestion de la mémoire et le fait que l'utilisation de la RAM "grimpe" ne signifie pas qu'il finira par consommer toute votre RAM. Je suis sûr que cela n'arrivera pas.
Art Gertner
1
Je ne sais pas comment fonctionnent les outils dédiés, mais vous pouvez calculer le hachage pour chaque fichier et l'enregistrer avec le chemin du fichier, puis trier par hachage et dédupliquer. Cela devrait être faisable avec un simple script Python ou peut-être même dans Bash. L'utilisation de la RAM doit être minimale, sauf pour l'étape de tri, mais je suppose que vous pouvez utiliser une sorte de mergesort modifié pour le maintenir raisonnablement bas.
gronostaj
1
Oui, un outil dédié calcule le hachage, mais commencez par faire des choses comme regarder la taille du fichier, et hacher uniquement le début des fichiers pour limiter la quantité de hachages complets qui doivent être calculés.
Michael Stauffer
En ce qui concerne la RAM, je craignais de ralentir le serveur de fichiers - voir mon commentaire ci-dessous pour la réponse.
Michael Stauffer

Réponses:

4

Ou, existe-t-il un moyen de diriger un processus pour utiliser la RAM mappée sur disque afin qu'il y ait beaucoup plus disponible et qu'il n'utilise pas de RAM système?

Oui, cela s'appelle le lecteur de swap. Vous en avez probablement déjà un. Si vous avez peur de manquer de RAM, alors augmenter c'est un bon point de départ. Il fonctionne cependant automatiquement, il n'est donc pas nécessaire de faire quoi que ce soit de spécial.

Je ne m'inquiéterais pas des fdupes. Essayez-le, cela devrait fonctionner sans problème.

krowe
la source
Je pensais que compter sur l'échange ralentirait l'ensemble du système - c'est un serveur de fichiers occupé. Mais peut-être pas assez pour s'inquiéter? Je pourrais utiliser ulimit pour empêcher le processus d'utiliser plus que ram système dans tous les cas, je suppose, comme une sécurité intégrée. Mais il semble que krowe et smc ne pensent pas que les fdupes utiliseraient autant de RAM de toute façon, donc je devrais juste essayer.
Michael Stauffer
1

la recherche de doublons basés sur hashkey fonctionne bien et est très rapide.

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
la source
0

Écrivez une application rapide pour parcourir les arbres, en poussant (hachage, mtime) => chemin de fichier dans un dictionnaire ou en marquant le fichier pour suppression si l'entrée existe déjà. Le hachage sera juste un MD5 calculé sur les N premiers octets. Vous pouvez faire quelques passes différentes, avec un hachage sur un petit N puis un autre avec un hachage sur un grand N.

Vous pourriez probablement le faire en moins de vingt ou trente lignes de Python (en utilisant os.walk ()).

Dustin Oprea
la source