En realidad, hay una razón por la que recibió las conferencias: es la respuesta correcta a su problema. Aquí está el fondo, por lo que quizás pueda hacer algunos cambios en su entorno en vivo.
Primero: los directorios se almacenan en el sistema de archivos; piense en ellos como archivos, porque eso es exactamente lo que son. Cuando itera por el directorio, debe leer esos bloques desde el disco. Cada entrada de directorio requerirá suficiente espacio para contener el nombre de archivo y los permisos, y la información sobre dónde se encuentra ese archivo en el disco.
Segundo: los directorios no se almacenan con ningún pedido interno (al menos, no en los sistemas de archivos donde he trabajado con archivos de directorio). Si tiene 150,000 entradas y 2 subdirectorios, esas 2 referencias de subdirectorios pueden estar en cualquier lugar dentro de los 150,000. Tienes que iterar para encontrarlos, no hay forma de evitar eso.
Digamos que no se puede evitar el directorio grande. Su única opción real es tratar de mantener los bloques que comprenden el archivo de directorio en la caché en memoria, de modo que no esté golpeando el disco cada vez que acceda a ellos. Puede lograr esto iterando regularmente sobre el directorio en una cadena de fondo, pero esto causará una carga excesiva en sus discos e interferirá con otros procesos. Alternativamente, puede escanear una vez y realizar un seguimiento de los resultados.
La alternativa es crear una estructura de directorios por niveles. Si observa sitios web comerciales, verá URL como /1/150/15023.html, con el objetivo de mantener pequeña la cantidad de archivos por directorio. Piense en ello como un índice de BTree en una base de datos.
Por supuesto, puede ocultar esa estructura: puede crear una capa de abstracción del sistema de archivos que tome los nombres de los archivos y genere automáticamente el árbol de directorios donde se encuentran esos nombres de archivo.
me gustaría tratar de evitar caer en esa situación en el primer lugar. Tener una gran cantidad de archivos en un directorio es probable que disminuya la cantidad de operaciones del sistema de archivos. –
Lo sentimos, nuestro entorno en vivo tiene esto como parte del requisito. – erotsppa
La mayoría del otro código tendría que hacer algo similar de todos modos. Por cierto, un ciclo de 150000 iteraciones no toma 45 segundos. Es el IO lo que ralentiza las cosas. – nos