¿Cuántos archivos en un directorio son demasiados? (Descarga de datos de la red)

19

Saludos,

Estoy escribiendo algunos scripts para procesar imágenes de varios sitios web de fotos. En este momento estoy almacenando todos estos datos en archivos de texto individuales en el mismo directorio.

El directorio es accesible desde la web. Un usuario final realiza una llamada a un servicio web que devuelve la ruta al archivo que necesitará el usuario.

Me preguntaba en qué etapa vería un impacto en el rendimiento al tener todos estos archivos en el mismo directorio. (Si alguna)

Steve
fuente
relacionado: superusuario.com/q/453348/453247
Stephen R

Respuestas:

12

El rendimiento varía según el sistema de archivos que esté utilizando.

  • FAT: olvídalo :) (ok, creo que el límite es de 512 archivos por directorio)
  • NTFS: aunque puede contener 4 mil millones de archivos por carpeta, se degrada relativamente rápido: alrededor de mil comenzará a notar problemas de rendimiento, varios miles y verá que el explorador parece bloquearse durante bastante tiempo.
  • EXT3: el límite físico es de 32,000 archivos, pero el rendimiento sufre después de varios miles de archivos también.

  • EXT4: teóricamente ilimitado

  • ReiserFS, XFS, JFS, BTRFS: estos son los buenos para muchos archivos en un directorio, ya que son más modernos y están diseñados para manejar muchos archivos (los otros fueron diseñados en los días en que los discos duros se midieron en MB no GB) . El rendimiento es mucho mejor para muchos archivos (junto con ext4) ya que ambos usan un algoritmo de tipo de búsqueda binaria para obtener el archivo que deseas (los otros usan uno más lineal).

gbjbaanb
fuente
66
Esto está mal. No hay un límite de 32000 archivos en EXT3. Hay un límite de 32000 subdirectorios. Tengo un directorio aquí con más de 300000 archivos y funciona bien.
davidsheldon
1
bastante cierto: el límite de archivo es el límite de todo el sistema de archivos en inodes, pero está limitado a 32k enlaces (es decir, subdirectorios).
gbjbaanb
La declaración para NTFS actual tampoco es cierta, puede contener hasta 4,294,967,295 (2 ^ 32 - 1): technet.microsoft.com/en-us/library/cc781134%28WS.10%29.aspx
Fleshgrinder
NO confunda subdirectorios con archivos, en la máquina CentOS tenía 32000 subdirectorios, llegué al límite, moví todos los ARCHIVOS en ese directorio y aún funciona bien.
adrianTNT
8

Almaceno imágenes para servir en un servidor web, y tengo más de 300,000 imágenes en un directorio en EXT3. No veo problemas de rendimiento. Antes de configurar esto, hice pruebas con 500k imágenes en un directorio y accedí al azar a los archivos por nombre, y no hubo una desaceleración significativa con 500k sobre 10k imágenes en el directorio.

El único inconveniente que veo es que para sincronizar los nuevos con un segundo servidor, tengo que ejecutar rsynctodo el directorio, y no puedo simplemente decirle que sincronice un subdirectorio que contiene los más recientes miles.

davidsheldon
fuente
Bueno, para sincronizar con un segundo servidor, creo que debe crear una estructura y un algoritmo que mantenga los cambios, entonces este registro puede ahorrarle una gran cantidad de tiempo.
Bahadir Tasdemir
+1 Esto realmente responde la pregunta.
kubanczyk
Una desventaja, si usa un cliente FTP como FileZilla y desea enumerar el contenido de la carpeta, lleva un tiempo.
Kai Noack
3

La cantidad de archivos en una carpeta podría ser teóricamente ilimitada. Sin embargo, cada vez que el sistema operativo acceda a la carpeta específica para buscar archivos, tendrá que procesar todos los archivos de la carpeta. Con menos de 500 archivos, es posible que no note demoras. Pero cuando tiene decenas de miles de archivos en una sola carpeta, un simple comando de lista de carpetas (ls o dir) podría tomar demasiado tiempo. Cuando se puede acceder a estas carpetas a través de FTP, realmente será demasiado lento ...

Los problemas de rendimiento no dependerán realmente de su sistema operativo, sino de la velocidad del procesador del sistema, las capacidades de disco y la memoria. Si tiene tantos archivos, puede combinarlos en un solo archivo y usar un sistema de archivo que esté optimizado para almacenar muchos datos. Esto podría ser un archivo ZIP, pero mejor aún, almacénelos como blobs en una base de datos con el nombre del archivo como clave principal.

Wim ten Brink
fuente
¿Pero el acceso al archivo eliminará directamente los cuellos de botella con la búsqueda de directorios o el acceso a un directorio todavía tendrá una llamada de búsqueda subyacente? (Linux, debian)
steve
3
Acceder al archivo directamente mitigará estos problemas. He realizado pruebas en ext3, y acceder a un archivo por nombre en un directorio que contiene 500000 archivos no es significativamente más lento que uno que contiene 1000. Obviamente, hacer un lses un problema.
davidsheldon
Al conocer el nombre exacto, el acceso debe ser rápido. El problema sería principalmente cualquier código o comando que quiera obtener una lista de archivos.
Wim ten Brink
1

Mi regla de oro es dividir las carpetas si hay más de 1000 archivos y la carpeta se examinará (es decir, a través de Internet o Explorer) o 5000 archivos de lo contrario.

Bip bip
fuente
0

Como señala @skaffman, los límites dependen del sistema operativo. Es probable que se vea afectado por los límites de los sistemas operativos más antiguos. Recuerdo que una versión anterior de Solaris estaba limitada a 32768 archivos por directorio.

La solución habitual es usar algún tipo de hash, es decir, el servidor Cyrus imap divide a los usuarios por un hash alfabético:

/var/spool/imap/a/user/anna/
/var/spool/imap/a/user/albert/
/var/spool/imap/d/user/dan/
/var/spool/imap/e/user/ewan/
diciu
fuente
1
Gracias, definitivamente tendría algo en su lugar una vez que un directorio tenga más de 2k archivos. :)
steve
Esta pregunta tiene algunas buenas respuestas: serverfault.com/questions/95444/…
davey
Mi regla general es que más de 20,000 archivos en un directorio no es una buena idea. La mayoría de los sistemas de archivos modernos funcionan bien con esa cantidad de archivos. Una vez que llegue a 32k archivos en un directorio, algunos sistemas de archivos como ext3 comenzarán a tener serios problemas de rendimiento.
Phil Hollenback
Phil: ¿tiene alguna información sobre los problemas de rendimiento con más de 32k de archivos con ext3? No veo ninguna en este momento con más de 300k. Quizás sea algo que no está afectando mi patrón de uso.
davidsheldon
En mi trabajo anterior, el software científico generaría muchos archivos pequeños (pocos k cada uno) en un directorio. Definitivamente vimos que los tiempos de lectura del directorio de archivos> 32k se dispararían enormemente. Simplemente ejecutar 'ls' en un directorio con tantos archivos tomaría un minuto o más.
Phil Hollenback
0

Si está accediendo directamente a un archivo, el número de archivos en un directorio no es un problema de velocidad.

La cantidad de archivos que puede crear en un solo directorio depende del sistema de archivos que esté utilizando. Si está enumerando todos los archivos en el directorio o está buscando, ordenando, etc., tener muchos archivos ralentizará esas operaciones.

gbjbaanb está equivocado en su respuesta sobre el tamaño máximo de archivo de ext3. En general, ext limita el número de archivos en su disco en general. No puede crear más archivos, entonces tiene inodes en su tabla de inodes. Tiene razón al sugerir reiserfs para obtener más rendimiento con muchos archivos

Janusz
fuente
0

Carpeta marcada con archivos de 10K en NTFS (Windows 7, 64 bit). La carpeta con imágenes de 10K en cualquier vista (Lista, Icono, etc.) funciona y se desplaza sin ningún retraso sensible.

Vil
fuente