He estado trabajando en algunas deduplicaciones de datos que me obligaron a usar el sistema de archivos como una tabla hash. Esto dio lugar a algunos directorios que tomó horas literales a eliminar el uso de casi cualquier método razonable (es decir rm -rf
, ls -f1 | xargs rm
, find -delete
, etc.)
Bajo los sistemas de archivos Ext2 / 3/4, un directorio es un archivo que contiene una tabla hash desde nombres de archivos hasta números de inodo (¡en mi caso, alcanzando alrededor de 60 MB!) Según tengo entendido, correr rm -rf
y amigos es lento, porque sigue esta metodología:
Iterar sobre la tabla hash en el archivo de directorio. Por cada par de nombre de archivo-inodo encontrado, atómicamente:
- Disminuya el recuento de nombres en el inodo.
- Elimine la entrada de la tabla hash.
(La eliminación de los archivos / inodes ocurre cuando su número de nombres alcanza 0 y no hay programas que tengan descriptores de archivo abiertos que apunten a esos inodes).
Disminuir el recuento de nombres de un inodo es rápido.
Eliminar un archivo (especialmente uno pequeño) también es rápido: uno simplemente designa los bloques de unidades que el archivo posee como gratuitos en la tabla de disponibilidad.
La desaceleración, como puedo ver, surge en la eliminación de entradas de la tabla hash. Cada eliminación probablemente tenga la oportunidad de desencadenar un nuevo hash, ya que observé que el tamaño del archivo de directorio disminuye a medida que se eliminan los archivos.
Lo que pido es doble:
- ¿Es correcto mi razonamiento, ya que es la manipulación de la tabla hash lo que ralentiza el proceso?
Si es así, ¿hay alguna herramienta que haga lo siguiente (y que es así, probablemente mucho más rápido)?
- Disminuya el recuento de nombres de cada inodo listado en el archivo de directorio.
- Elimine todo el contenido del directorio completo a la vez.