2010-02-21 22 views
7

Desarrollo algunos proyectos PHP en la plataforma Linux. ¿Hay alguna desventaja de poner varios miles de imágenes (archivos) en un directorio? Este es un conjunto cerrado que no crecerá. La alternativa sería separar estos archivos usando una estructura de directorios basada en alguna ID (de esta manera, digamos que solo 100 en un directorio).Muchos archivos en un directorio?

Hago esta pregunta, porque a menudo veo tal separación cuando miro las URL de las imágenes en diferentes sitios. Puede ver que la separación de directorios se realiza de tal manera que no haya más de varias cientos de imágenes en un directorio.

¿Qué ganaría al no colocar varios miles de archivos (de conjuntos no crecientes) en un directorio, sino separarlos en grupos de p. Ej. 100? ¿Vale la pena complicar las cosas?

ACTUALIZACIÓN:

  • No habrá ninguna iteración programática sobre los archivos en un directorio (sólo un acceso directo a una imagen que es el nombre de archivo)
  • Quiero hacer hincapié en que el conjunto de imágenes está cerrado. Son menos de 5000 imágenes, y eso es todo.
  • No hay categorización lógica de estas imágenes
  • acceso humano/de exploración no se requiere
  • Las imágenes tienen nombres de archivo únicos
  • SO: Debian/Linux 2.6.26-2-686, Sistema de Archivos: ext3

información valiosa de las respuestas:

¿Por qué separar muchos archivos a diferentes directorios:

  • "límite de archivos de 32k por directorio cuando se utiliza ext3 a través de NFS"
  • motivos de rendimiento (velocidad de acceso) [pero para varios miles de archivos que es difícil decir si vale la pena, sin medir]

Respuesta

2

generalmente el motivo de tal división es el rendimiento del sistema de archivos. para un conjunto cerrado de 5000 archivos No estoy seguro de que valga la pena la molestia. Sugiero que pruebe el método simple de colocar todos los archivos en un solo directorio, pero esté atento al tiempo real que lleva acceder a los archivos.

si ve que no es lo suficientemente rápido para sus necesidades, puede dividirlo como sugirió.

Tuve que dividir archivos por motivos de rendimiento. Además, me topé con un límite de archivos de 32k por directorio cuando uso ext3 sobre nfs (no estoy seguro de si es un límite de nfs o ext3). así que esa es otra razón para dividir en múltiples directorios. en cualquier caso, intente con un solo directorio y solo divida si ve que no es lo suficientemente rápido.

+1

'(no estoy seguro si es un límite de nfs o ext3)' Es un límite ext3. – thomasrutter

0

La única razón por la que podía imaginar dónde sería perjudicial era cuando iteraba sobre el directorio. Más archivos, significa más iteraciones. Pero eso es básicamente todo lo que puedo pensar desde una perspectiva de programación.

1

Creo que hay dos aspectos en esta pregunta:

  1. ¿El sistema de archivos de Linux que está utilizando de manera eficiente apoyar directorios con miles de archivos. No soy un experto, pero creo que los sistemas de archivos más nuevos no tendrán problemas.

  2. ¿Hay problemas de rendimiento con funciones PHP específicas? Creo que el acceso directo a los archivos debería estar bien, pero si estás haciendo una lista de directorios, es posible que tarde o temprano tengas problemas de memoria o de tiempo.

7

Además de acceso a archivos más rápido mediante la separación de las imágenes en los subdirectorios, también se extienden de forma espectacular el número de archivos que puede realizar un seguimiento antes de llegar a los límites naturales del sistema de archivos.

Un método sencillo es md5() el nombre del archivo, a continuación, utilizar los primeros n caracteres como el nombre del directorio (por ejemplo, substr(md5($filename), 2)). Esto garantiza una distribución razonablemente pareja (frente a los primeros n caracteres del nombre de archivo directo).

+0

Más de un nivel sería útil en otros niveles de subdirectorios. Por ejemplo: ./12/34/56/78/1234567890abc.jpg. –

+0

Ok, entonces md5 sería un enfoque general. En mi caso, ya tengo una ID única, porque cada imagen está asociada con exactamente una fila de la base de datos (que tiene su fila principal, por supuesto). Creo que es un escenario típico. – JohnM2

+1

Vale la pena considerar que estos números pueden no estar tan distribuidos como lo serían los hashes md5. –

0

Varios miles de imágenes siguen estando bien. Cuando accede a un directorio, los sistemas operativos leen la lista de sus archivos por bloques de 4K. Si tiene una estructura de directorios simple, puede tomar tiempo leer la lista completa del archivo si hay muchos archivos (por ejemplo, cien mil) en él.

1

No hay ninguna razón para dividir esos archivos en varios directorios, si no espera conflictos de nombre de archivo y si no necesita iterar sobre esas imágenes en ningún momento.

Pero aún así, si puede pensar en una categorización sugestiva, no es una mala idea ordenar las imágenes un poco, incluso si es solo por razones de mantenimiento.

0

Si cambiar el sistema de archivos es una opción, le recomiendo que se mude a cualquier lugar donde almacene todas las imágenes en un sistema de archivos ReiserFS. Es excelente en el almacenamiento/acceso rápido de muchos archivos pequeños.

Si no, la respuesta de MightyE de dividirlas en carpetas es más lógica y aumentará los tiempos de acceso por un margen considerable.

Cuestiones relacionadas