Tengo más de 100,000 archivos en un directorio en mi MacOS X y parece que es lento para mi script leer un archivo en ellos.
¿Hay alguna limitación o recomendación para tener tantos archivos? ¿Debería dividirlos en algunos directorios?
La limitación que encontré fue que no puedo mv * foo
para todos los 100,000 archivos. Muestra un error, diciendo "argumento demasiado largo". Funciona con aproximadamente menos de 20,000 archivos.
macos
mac
filesystems
Daisuki Honey
fuente
fuente
*
o?
como parte de un argumento para un comando, el sistema operativo busca en todo el directorio archivos coincidentes (lento) y luego reemplaza su argumento con una lista de cada archivo coincidente (largo), que luego pasa al mando. Se podría hacer mejor con un lazo o con varios mv, por ejemplo,mv a* foo && mv b* foo
.Respuestas:
Según esta respuesta de Stack Overflow y detalles específicos en el sitio de Apple , una carpeta individual puede contener hasta 2,1 mil millones de elementos.
Dicho esto, solo porque puede contener hasta 2,1 mil millones de artículos no significa que pueda mantener el rendimiento a ese nivel. De acuerdo con Wikipedia ; El énfasis es mío:
Por lo tanto, el rendimiento se degrada naturalmente gracias al hecho de que el archivo de catálogo solo puede ser utilizado por un programa a la vez. Y si el directorio crece en tamaño, el riesgo / degradación causada por ese problema solo aumentará; más archivos significa más oportunidades para que los programas accedan a los archivos en ese directorio. Confirmación adicional de esa idea aquí ; De nuevo el énfasis es mío:
fuente
Respuesta corta: Bueno, si estás leyendo 100,000 archivos, podría esperar que el script sea lento.
Respuesta larga: para responder a esta pregunta más a fondo, debe mirar el sistema de archivos en una Mac. Las Mac usan el HFS + ( Hierarchical File System Plus ), que es un sistema de archivos moderno que tiene limitaciones, pero solo en situaciones extremas.
Desde mi experiencia, se parece mucho a un sistema de archivos de registro diario Linux EXT. Admite directorios de montaje, permisos similares a UNIX, etc. Dirigió archivos en un formato de 32 bits, lo que hace que la cantidad máxima de archivos que se pueden almacenar en un volumen sea 4,294,967,295, según esta fuente.
El sistema de archivos comienza a romperse con archivos de más de 8 EB en sistemas modernos y hasta 2,1 mil millones de archivos y carpetas en una ubicación como se describe aquí .
Dada la forma en que HFS +, o en realidad cualquier sistema de archivos está configurado para eso, tener muchos archivos en una carpeta no debería hacer nada 'extraño'.
Honestamente, no creo que haya una mejora en el rendimiento al distribuir los archivos en una jerarquía de carpetas más compleja. En realidad, esta técnica podría ser menos eficiente porque su script tendría que hacer llamadas para cambiar los directorios a mitad del proceso.
fuente