Tengo una aplicación que escribe en un directorio ext3 que con el tiempo ha crecido a aproximadamente tres millones de archivos. No hace falta decir que leer la lista de archivos de este directorio es insoportablemente lento.
No culpo a ext3. La solución adecuada hubiera sido dejar que el código de la aplicación escribiera en subdirectorios, como en ./a/b/c/abc.ext
lugar de usar solo ./abc.ext
.
Estoy cambiando a esa estructura de subdirectorio y mi pregunta es sencilla: ¿aproximadamente cuántos archivos debo esperar almacenar en un directorio ext3 mientras sigo obteniendo un rendimiento aceptable? Cual es tu experiencia
O en otras palabras; suponiendo que necesito almacenar tres millones de archivos en la estructura, ¿cuántos niveles de profundidad debería tener la ./a/b/c/abc.ext
estructura?
Obviamente, esta es una pregunta que no se puede responder exactamente, pero estoy buscando una estimación del parque de pelota.
http://en.wikipedia.org/wiki/Ext3#Functionality : esto menciona que un directorio solo puede tener aproximadamente 32000 subdirectorios, pero no menciona los archivos.
http://roopindersingh.com/2008/05/10/ext3-handling-large-number-of-files-in-a-directory/
Además, odio el intercambio de expertos, pero leí un comentario sobre esta pregunta que dice que es ideal tener menos de 10-15,000 por directorio.
fuente
Puedo confirmar en un servidor bastante potente con mucha memoria bajo una carga decente que 70,000 archivos pueden causar todo tipo de estragos. Fui a eliminar una carpeta de caché con 70k archivos y causó que apache comenzara a generar nuevas instancias hasta que alcanzó un máximo de 255 y el sistema usó toda la memoria libre (16 gb, aunque la instancia virtual puede haber sido menor). De cualquier manera, mantenerlo por debajo de 25,000 es probablemente un movimiento muy prudente
fuente
En mi experiencia, el mejor enfoque es no sobre-diseñar la estructura del archivo de antemano. Como se menciona en al menos otra respuesta, hay extensiones del sistema de archivos que se ocupan del problema de rendimiento.
El problema que he encontrado con más frecuencia es la usabilidad en el aspecto administrativo. La cantidad mínima de trabajo que puede hacer para disminuir la cantidad de archivos en un directorio es probablemente el enfoque que necesita en este momento.
sqrt (3_000_000) == 1732
Un par de miles de archivos en un solo directorio me parece razonable. Sé tu propio juez para tu propia situación. Para lograr esto, intente dividir los archivos en un solo nivel de directorios hash para que el número promedio de archivos por directorio sea aproximadamente el mismo que el número de directorios.
Dada su ejemplo, esto sería
./a/abc.ext
,./ab/abc.ext
,./abc/abc.ext
, ....La difusión de los archivos dependerá en gran medida de los nombres de archivo reales. Imagine que aplica esta técnica a un directorio de un millón de archivos cada uno nombrado
foobar???.txt
. Hay formas de lograr una distribución más uniforme, como el hash basado en el valor de un número particular de bits de la suma MD5 de cada nombre de archivo, pero me atreveré a adivinar que sería excesivo para lo que está tratando de lograr.fuente
Hmm, leí este artículo recientemente . Esencialmente, usted aprovecha la distribución de su algoritmo de hash favorito. Empecé a jugar con los números, un INT firmado con MySQL tiene un valor máximo de 2147483647. También puede variar el número deseado de archivos por directorio y el número de subdirectorios para establecer el número final de subdirectorios / archivos. división por directorio para un conjunto de datos dado, pero es difícil encontrar evidencia empírica sobre organizaciones óptimas de directorio / archivo. Este artículo da una idea de las diferencias de rendimiento entre los sistemas de archivos (algunas métricas interesantes), pero nada sobre las organizaciones óptimas.
fuente
Creo que estás pensando demasiado en esto. Si incluso eligió un solo nivel adicional de directorios y pudo equilibrar las cosas de manera uniforme, tendría 1732 * directorios y 1732 archivos por directorio.
A menos que planee necesitar decenas de miles de millones de archivos, podría elegir un número entre 1000 y 100,000 y obtener buenos resultados.
* raíz cuadrada de 3 millones.
fuente