Jueves, Agosto 16, 2018

Presentación de godedupe (alternativa a fdupes)

gopher

Unos compañeros y yo estuvimos trabajando hace un tiempo en una alternativa para fdupes. Como en este blog se suelen comentar muchas herramientas y programas diversos, decidí escribir este breve post explicando el proyecto y el estado actual para darlo a conocer.

Descripción

Originalmente queríamos aprender Go, estuvimos pensando en proyectos más o menos sencillos pero útiles y finalmente decidimos que una buena forma de hacerlo sería hacer una especie de fdupes. A diferencia de este, queríamos tratar de hacer una alternativa más eficiente y de paso tener la libertad de experimentar de forma relativamente sencilla. Así que decidimos crear este un nuevo proyecto (llamado godedupe). Su principal función, al igual que fdupes, es la de encontrar archivos duplicados en el sistema (pero godedupe según los tests tarda la mitad de tiempo y tiene opciones que fdupes no tiene).

Para buscar estos duplicados el algoritmo que sigue godedupe es el siguiente; primero comprueba si el tamaño de dos ficheros son iguales o no, si se da el caso es evidente que no son duplicados, en caso contrario (si tienen el mismo tamaño), se hace un checksum de los primeros 1024 kbytes de los dos archivos y se comprueba (de esta forma evitamos tener que leer todo el fichero), por último si el checksum sigue siendo el mismo hacemos un checksum de todo el fichero entero. Obviamente existe la posibilidad teórica de un falso positivo, pero dado que en total hacemos dos checksums y además comprobamos el tamaño del fichero, suponemos que la posibilidad de que eso ocurra en la práctica es despreciable (si alguien opina lo contrario, estaría interesante ver una prueba de ello).

A parte también queríamos (aún no esta implementado) usar fuzzy hashing para poder buscar archivos que sean muy similares aún no siendo duplicados, por ejemplo en el caso de que existieran dos ficheros de texto duplicados y se modificara uno de ellos. El problema es que esto resulta extremadamente lento, tienes que leer todos los archivos enteros.

Benchmark

Para evaluar la diferencia de rendimiento entre godedupe y fdupes se ejecuto un script (https://github.com/OSPG/godedupe/blob/develop/simple_benchmark.sh) muy sencillo que ejecuta tres veces fdupes y godedupe en dos casos de uso distinto. En un caso crea pocos ficheros pero de un gran tamaño (2 GB), en el segundo caso crea muchos ficheros de pequeño tamaño (pocos bytes). En cada caso imprime el tiempo que tarda en ejecutarse godedupe y fdupes.

Este test se probo en dos máquinas muy distintas (una tenía un i7 con 8 threads, 16GB y SSD y el otro un dual core bastante viejo con 4GB de RAM y un HDD que también era bastante lento), los resultados fueron los siguientes (los valores son la media de las tres ejecuciones).

  • Máquina 1
    • Test 1
      • 12.8s (fdupes)
      • 5.9s (godedupe)
    • Test 2
      • 1.05s (fdupes)
      • 0.2s (godedupe)
  • Máquina 2
    • Test 1
      • 117s (fdupes)
      • 59.8s (godedupe)
    • Test 2
      • 4.6s (fdupes)
      • 1.1s (godedupe)

Aún así, aún hay rango para experimentar y tratar de añadir más optimizaciones, sobretodo para la parte de I/O. Por ejemplo reduciendo la cantidad de lecturas al disco a la hora de recorrer los directorios.

Funcionalidades

A parte del tema de rendimiento, godedupe también tiene unos defaults más sanos. Por defecto ignora los ficheros y carpetas ocultas y los ficheros vacíos que en general no nos interesa comprobar. Por defecto también recorre las carpetas que se le pasen argumentos recursivamente, por lo que debería ser más fácil de usar que fdupes.

También tiene opciones que fdupes no tiene, como filtrar por pattern (por ejemplo para filtrar extensiones de ficheros),  o para limitar la profundidad de la búsqueda como find. Por otro lado falta añadir alguna opción como la que tiene fdupes para borrar los duplicados automáticamente.

Actualmente godedupe solo tiene un paquete disponible para Gentoo mediante un overlay externo (https://github.com/OSPG/gentoo-overlay/tree/master/app-misc/godedupe). Pero la idea es que a medida que el proyecto vaya madurando se vayan creando paquetes para otras distros, como arch o void. Si alguien estuviera interesado en hacer un paquete para alguna distro o aportar alguna idea o colaborar de cualquier forma esta bienvenido.

Para todo lo que sean ideas o propuestas en general lo mejor es abrir una issue o si es un aporte de código mandar una PR en el repositorio del proyecto alojado en Github (no, a mi tampoco me gusta Github) https://github.com/OSPG/godedupe.

 

Fuente: lignux

¿Quién está en línea?

Hay 137 invitados y ningún miembro en línea

Contador de Visitas

9311109
Hoy Hoy 418
Ayer Ayer 824
Esta semana Esta semana 3282
Este mes Este mes 18190
Total de Visitas Total de Visitas 9311109

Día con más
visitantes

08-05-2018 : 1937

Gracias por su visita