¿Alguna limitación para tener muchos archivos en un directorio en Mac OS X?

9

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 * foopara todos los 100,000 archivos. Muestra un error, diciendo "argumento demasiado largo". Funciona con aproximadamente menos de 20,000 archivos.

Daisuki Honey
fuente
Actualmente tengo 380,000 archivos en un directorio y me doy cuenta de que incluso abrir un archivo simplemente lleva más de 10 segundos. He decidido separarlos en algunos directorios.
Daisuki Honey
1
El sistema de archivos HFS + debería poder almacenar y acceder a grandes cantidades de archivos en un directorio por su nombre completo sin demasiados problemas. Pero debes tener cuidado con los comodines. Cuando usa *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.
Matthias Fripp

Respuestas:

1

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:

El archivo de catálogo, que almacena todos los registros de archivos y directorios en una sola estructura de datos, genera problemas de rendimiento cuando el sistema permite la multitarea, ya que solo un programa puede escribir en esta estructura a la vez, lo que significa que muchos programas pueden estar esperando en la cola debido a un programa "acaparando" el sistema. También es un problema serio de confiabilidad, ya que el daño a este archivo puede destruir todo el sistema de archivos.

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:

El archivo de catálogo es una estructura complicada. Debido a que mantiene toda la información de archivos y directorios, obliga a la serialización del sistema de archivos, lo que no es una situación ideal cuando hay una gran cantidad de subprocesos que desean realizar E / S de archivos. En HFS, cualquier operación que cree un archivo o modifique un archivo de alguna manera tiene que bloquear el archivo del catálogo, lo que evita que otros hilos incluso tengan acceso de solo lectura al archivo del catálogo. El acceso al archivo de catálogo debe ser de escritor único / multireader.

JakeGould
fuente
Muchas gracias. Entiendo que el acceso al archivo del catálogo será el cuello de botella y puede causar serios problemas de rendimiento, especialmente para la multitarea.
Daisuki Honey
@DaisukiHoney De nada! Entonces, si encuentra útil mi respuesta, recuerde votarla. Y si fue la respuesta la que resolvió su problema, recuerde marcarlo como tal.
JakeGould
Sí, definitivamente voy a votar tu respuesta y marcarla. De nuevo, muchas gracias.
Daisuki Honey
Las secciones de Wikipedia que cita están hablando de los límites de escalabilidad por sistema de archivos, no por directorio: solo hay un archivo de catálogo por sistema de archivos y todo el acceso debe serializarse en eso. Es bastante irrelevante para la pregunta.
Poolie
@poolie La pregunta es sobre por directorio que existe en un sistema de archivos. El archivo de catálogo existe por sistema de archivos, pero el directorio también existe en el mismo sistema de archivos. Es relevante para una pregunta relacionada con más de 10,000 archivos en un directorio que existe en un solo sistema de archivos. Pero esta pregunta tiene más de 2 años, así que gracias por el enlace Wiki. He actualizado mi respuesta para incluir la nueva redacción, así como un enlace directo a la sección en cuestión.
JakeGould
4

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.

James Taylor
fuente
Derecha. Pensé en cambiar la jerarquía de directorios, pero causa un algoritmo más complicado y sospecho que mejora mucho el rendimiento. Gracias por la respuesta. Actualmente tengo 200,000 archivos en el directorio y podría tener 1,000,000 al final. Espero que funcione bien sin ese mal desempeño.
Daisuki Honey
@DaisukiHoney Si está trabajando con tantos archivos, podría valer la pena ver si puede subdividir las cosas en directorios. Puede ser difícil de hacer en esta etapa, pero podría hacer que las cosas sean un poco más estables en el futuro.
JakeGould
@JakeGould Gracias por el consejo. He estado pensando en la reestructuración porque podría agregar algunos archivos más. Gracias.
Daisuki Honey