Tenía un directorio que tenía alrededor de 5 millones de archivos. Cuando intenté ejecutar el ls
comando desde este directorio, mi sistema consumió una gran cantidad de memoria y se bloqueó después de algún tiempo. ¿Hay alguna manera eficiente de enumerar los archivos que no sea usar el ls
comando?
70
ls
esos usos--color
o-F
como eso significaría hacer unlstat(2)
para cada archivo.ls
llamada pura o usaste opciones?Respuestas:
Evite ordenar usando:
O equivalente:
fuente
-1
bandera podría ayudar.-1
lleva aún más tiempo.-C
cuando stdout es una terminal,-1
cuando es una tubería) es confuso. Cuando está experimentando y midiendo, cambia entre ver la salida (para asegurarse de que el comando está haciendo lo que espera) y suprimirla (para evitar el factor de confusión del rendimiento de la aplicación de terminal). Es mejor usar los comandos que se comportan de la misma manera en ambos modos, para definir explícitamente el formato de salida a través de-1
,-C
,-l
, etcls
en realidad clasifica los archivos e intenta enumerarlos, lo que se convierte en una gran sobrecarga si estamos tratando de enumerar más de un millón de archivos dentro de un directorio. Como se menciona en este enlace, podemos usarstrace
ofind
para enumerar los archivos. Sin embargo, esas opciones también parecían inviables para mi problema ya que tenía 5 millones de archivos. Después de algún poco de google, he encontrado que si enumeramos los directorios usandogetdents()
, se supone que es más rápido, porquels
,find
yPython
las bibliotecas utilizanreaddir()
que es más lento pero utilizagetdents()
debajo.Podemos encontrar el código C para enumerar los archivos usando
getdents()
desde aquí :Copie el programa C anterior en el directorio en el que deben enumerarse los archivos. Luego ejecute los siguientes comandos.
Ejemplo de tiempos :
getdents
puede ser mucho más rápido quels -f
, dependiendo de la configuración del sistema. Aquí hay algunos tiempos que demuestran un aumento de velocidad de 40x para listar un directorio que contiene aproximadamente 500k archivos sobre un montaje NFS en un clúster de cómputo. Cada comando se ejecutó 10 veces en sucesión inmediata, primerogetdents
, luegols -f
. La primera ejecución es significativamente más lenta que todas las demás, probablemente debido a fallas en la página de almacenamiento en caché NFS. (Aparte: sobre este montaje, eld_type
campo no es confiable, en el sentido de que muchos archivos aparecen como tipo "desconocido").fuente
ls
?getdents
vsreaddir
pierde el punto.La razón más probable por la que es lenta es la coloración del tipo de archivo, puede evitar esto con
\ls
o/bin/ls
desactivando las opciones de color.Si realmente tiene tantos archivos en un directorio, usar en su
find
lugar también es una buena opción.fuente
ls -U --color
llevaría mucho tiempo ya questat
cada archivo. Entonces ambos son correctos.ls
y tiene un alias por defecto en muchos muchos.bashrc
s./bin/ls -U
y obtuve salida en poco tiempo, en comparación con esperar mucho tiempo antesMe parece que
echo *
funciona mucho más rápido que ls. YMMV.fuente
*
. Por lo tanto, esta forma probablemente todavía sea muy lenta para 5 millones de archivos.