Colocar muchos (10 millones) archivos en una carpeta

17

Acabo de agregar una función de búsqueda predictiva (ver ejemplo a continuación) a mi sitio que se ejecuta en un servidor Ubuntu. Esto se ejecuta directamente desde una base de datos. Quiero almacenar en caché el resultado para cada búsqueda y usarlo si existe, de lo contrario crearlo.

¿Habría algún problema conmigo guardando los posibles resultados de 10 millones de cira en archivos separados en un directorio? ¿O es aconsejable dividirlos en carpetas?

Ejemplo:

Kohjah Breese
fuente
55
Sería mejor separarse. Cualquier comando que intente enumerar el contenido de ese directorio probablemente decidirá dispararse a sí mismo.
muru
8
Entonces, si ya tiene una base de datos, ¿por qué no usarla? Estoy seguro de que el DBMS podrá manejar mejor millones de registros en comparación con el sistema de archivos. Si está empeñado en usar el sistema de archivos, debe idear un esquema de división utilizando algún tipo de hash, en este punto, en mi humilde opinión, parece que usar el DB será menos trabajo.
roadmr
3
Otra opción para el almacenamiento en caché que se ajustaría mejor a su modelo podría ser memcached o redis. Son almacenes de valores clave (por lo que actúan como un solo directorio y accede a los elementos solo por su nombre). Redis es persistente (no perderá datos cuando se reinicie) donde memcached es para más elementos temporales.
Stephen Ostermiller
2
Hay un problema de huevo y gallina aquí. Los desarrolladores de herramientas no manejan directorios con grandes cantidades de archivos porque las personas no lo hacen. Y la gente no crea directorios con una gran cantidad de archivos porque las herramientas no lo admiten bien. Por ejemplo, entiendo que una vez (y creo que esto sigue siendo cierto), una solicitud de función para hacer una versión de generador os.listdiren Python fue denegada por esta razón.
Desde mi propia experiencia, he visto roturas al revisar 32k archivos en un solo directorio en Linux 2.6. Es posible sintonizar más allá de este punto, por supuesto, pero no lo recomendaría. Simplemente divídalo en unas pocas capas de subdirectorios y será mucho mejor. Personalmente, lo limitaría a alrededor de 10,000 por directorio, lo que le daría 2 capas.
Wolph

Respuestas:

25

¿Habría algún problema conmigo guardando los resultados potenciales de alrededor de 10 millones en archivos separados en un directorio?

Si. Probablemente haya más razones, pero estas puedo publicarlas en la parte superior de mi cabeza:

  • tune2fstiene una opción llamada dir_indexque tiende a encenderse de manera predeterminada (en Ubuntu lo es) que le permite almacenar aproximadamente 100k archivos en un directorio antes de ver un impacto en el rendimiento. Eso ni siquiera está cerca de los 10 millones de archivos en los que está pensando.

  • extLos sistemas de archivos tienen un número máximo fijo de inodes. Cada archivo y directorio usa 1 inodo. Úselo df -ipara una vista de sus particiones e inodos libres. Cuando te quedas sin inodos no puedes crear nuevos archivos o carpetas.

  • comandos como rmy lscuando se usan comodines expanden el comando y terminarán con una "lista de argumentos demasiado larga". Tendrá que usar findpara eliminar o enumerar archivos. Y findtiende a ser lento.

¿O es aconsejable dividirlos en carpetas?

Si. Definitivamente. Básicamente, ni siquiera puede almacenar archivos de 10 m en 1 directorio.

Yo usaría la base de datos. Si desea almacenarlo en caché para un sitio web, eche un vistazo a " solr " ("proporcionar indexación distribuida, replicación y consulta de carga equilibrada").

Rinzwind
fuente
8

Terminé con el mismo problema. Ejecute mis propios puntos de referencia para averiguar si puede colocar todo en la misma carpeta en lugar de tener varias carpetas. ¡Parece que puedes y es más rápido!

Punto de referencia

Ref: https://medium.com/@hartator/benchmark-deep-directory-structure-vs-flat-directory-structure-to-store-millions-of-files-on-ext4-cac1000ca28

Hartator
fuente
1
Gracias, esto es muy útil. Estoy usando esto en un sitio y ha sido un verdadero problema reprogramar esta parte para tener estructuras de directorio /abc/efg.html. Así que volveré a un directorio plano en el futuro.
Kohjah Breese
0

Una búsqueda binaria puede manejar fácilmente millones de registros, por lo que buscar en un solo directorio no sería un problema. Lo hará muy rápido.

Básicamente, si está utilizando un sistema de 32 bits, la búsqueda binaria de registros de hasta 2 Gb es fácil y buena.

Berekely DB, un software de código abierto, le permitirá almacenar fácilmente el resultado completo en una sola entrada y tendrá la búsqueda integrada.

Ashok Chand Mathur
fuente