¿Cómo deduplicar 40 TB de datos?

17

Heredé un grupo de investigación con ~ 40 TB de datos en tres sistemas de archivos. Los datos se remontan a casi 15 años, y es muy probable que haya una buena cantidad de duplicados a medida que los investigadores copian los datos de los demás por diferentes razones y luego simplemente se quedan con las copias.

Sé sobre herramientas de eliminación de duplicados como fdupes y rmlint. Estoy tratando de encontrar uno que funcione en un conjunto de datos tan grande. No me importa si toma semanas (o tal vez incluso meses) rastrear todos los datos; probablemente lo estrangularé de todos modos para ser fácil en los sistemas de archivos. Pero necesito encontrar una herramienta que sea de alguna manera súper eficiente con RAM, o que pueda almacenar todos los datos intermedios que necesita en archivos en lugar de RAM. Supongo que mi RAM (64 GB) se agotará si rastreo todos estos datos como un conjunto.

Estoy experimentando con fdupes ahora en un árbol de 900 GB. Está en un 25% y el uso de RAM se ha estado incrementando lentamente todo el tiempo, ahora es de 700 MB.

O, ¿hay alguna manera de dirigir un proceso para usar RAM asignada en disco para que haya mucho más disponible y no use RAM del sistema?

Estoy ejecutando CentOS 6.

Michael Stauffer
fuente
Los sistemas de archivos son XFS, en caso de que sea relevante. Es decir, sé que no es un fs con capacidades de eliminación de duplicados como XFS.
Michael Stauffer
¿Por qué estás preocupado por la RAM en primer lugar? El sistema operativo tiene sus propios algoritmos de administración de memoria y el hecho de que el uso de RAM se está "incrementando" no significa que eventualmente se comerá toda su RAM. Estoy bastante seguro de que no sucederá.
Art Gertner
1
No sé cómo funcionan las herramientas dedicadas, pero puede calcular el hash para cada archivo y registrarlo junto con la ruta del archivo, luego ordenar por hash y deduplicar. Debería ser factible con un simple script de Python o tal vez incluso en Bash. El uso de RAM debería ser mínimo, excepto para el paso de clasificación, pero supongo que podría usar algún tipo de combinación combinada para mantenerlo razonablemente bajo.
gronostaj
1
Sí, la herramienta dedicada calcula el hash, pero primero haga cosas como mirar el tamaño del archivo y solo el comienzo de los archivos para limitar la cantidad de hash completos que deben calcularse.
Michael Stauffer
En cuanto a la RAM, me preocupaba ralentizar el servidor de archivos; vea mi comentario a continuación para la Respuesta.
Michael Stauffer

Respuestas:

4

O, ¿hay alguna manera de dirigir un proceso para usar RAM asignada en disco para que haya mucho más disponible y no use RAM del sistema?

Sí, se llama unidad de intercambio. Probablemente ya tengas uno. Si le preocupa quedarse sin RAM, entonces aumentar este es un buen lugar para comenzar. Sin embargo, funciona automáticamente, por lo que no es necesario hacer nada especial.

No me preocuparía por los fdupes. Pruébalo, debería funcionar sin problemas.

krowe
fuente
Estaba pensando que confiar en el intercambio ralentizaría todo el sistema: es un servidor de archivos ocupado. Pero tal vez no es suficiente para preocuparse? Podría usar ulimit para evitar que el proceso use más que ram de sistema en cualquier caso, supongo, como a prueba de fallas. Pero parece que krowe y smc no piensan que los fdupes usarían tanto ram de todos modos, así que debería intentarlo.
Michael Stauffer
1

encontrar duplicados basados ​​en hashkey funciona bien y es muy rápido.

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
fuente
0

Escriba una aplicación rápida para caminar por los árboles, ya sea empujando (hash, mtime) => ruta de archivo en un diccionario o marcando el archivo para su eliminación si la entrada ya existe. El hash solo será un MD5 calculado sobre los primeros N bytes. Puede hacer un par de pases diferentes, con un hash sobre una N pequeña y luego otro con un hash sobre una N. grande

Probablemente podría hacer esto en menos de veinte o treinta líneas de Python (usando os.walk ()).

Dustin Oprea
fuente