J'avais un répertoire qui contenait environ 5 millions de fichiers. Lorsque j'ai essayé d'exécuter la ls
commande à l'intérieur de ce répertoire, mon système a consommé une énorme quantité de mémoire et s'est bloqué après un certain temps. Existe-t-il un moyen efficace de répertorier les fichiers autrement qu'en utilisant la ls
commande?
70
ls
cet usage--color
ou-F
pour signifier que vous feriez unlstat(2)
pour chaque fichier.ls
appel ou avez-vous utilisé des options?Réponses:
Évitez de trier en utilisant:
Ou équivalent:
la source
-1
drapeau pourrait aider.-1
prend encore plus longtemps.-C
quand stdout est un terminal,-1
quand il s'agit d'un tube) est déroutant. Lorsque vous expérimentez et mesurez, vous basculez entre afficher la sortie (pour vous assurer que la commande fonctionne comme vous le souhaitez) et la supprimer (pour éviter le facteur de confusion du débit de l'application de terminal). Il vaut mieux utiliser les commandes qui se comportent de la même manière dans les deux modes, définir explicitement le format de sortie via-1
,-C
,-l
, etc.ls
trie réellement les fichiers et essaie de les lister, ce qui devient un lourd fardeau si nous essayons de répertorier plus d’un million de fichiers dans un répertoire. Comme mentionné dans ce lien, nous pouvons utiliserstrace
oufind
répertorier les fichiers. Cependant, ces options semblaient également irréalisables pour mon problème puisque j'avais 5 millions de fichiers. Après un peu de recherche sur Google, j'ai trouvé que si nous listons les répertoires en utilisantgetdents()
, il est supposé être plus rapide, carls
,find
et lesPython
bibliothèques utilisentreaddir()
ce qui est plus lent mais utilise engetdents()
dessous.Nous pouvons trouver le code C à la liste des fichiers à l' aide
getdents()
d' ici :Copiez le programme C ci-dessus dans le répertoire dans lequel les fichiers doivent être listés. Puis exécutez les commandes ci-dessous.
Exemple de minutage :
getdents
peut être beaucoup plus rapide quels -f
, en fonction de la configuration du système. Voici quelques timings démontrant une augmentation de 40 fois la vitesse de création d'un répertoire contenant environ 500 000 fichiers sur un montage NFS dans un cluster de calcul. Chaque commande a été exécutée 10 fois en succession immédiate, d’abordgetdents
, puisls -f
. La première exécution est nettement plus lente que toutes les autres, probablement en raison de défauts de mise en mémoire cache NFS. (En outre: sur ce montage, led_type
champ n'est pas fiable, en ce sens que de nombreux fichiers apparaissent sous le type "inconnu".)la source
ls
?getdents
vsreaddir
manque le point.Le plus probable raison pour laquelle il est lent est colorant de type de fichier, vous pouvez éviter cela avec
\ls
ou de/bin/ls
désactiver les options de couleur.Si vous avez vraiment autant de fichiers dans un répertoire, utiliser à la
find
place est également une bonne option.la source
ls -U --color
cela prendrait beaucoup de temps, carstat
chaque fichier serait traité. Donc les deux sont corrects.ls
et est alias par défaut dans de nombreuses autres applications.bashrc
./bin/ls -U
sortie et je l'ai obtenue en un rien de temps, comparé à attendre très longtemps avantJe trouve que ça
echo *
marche beaucoup plus vite que ls. YMMV.la source
*
. Donc, cette manière est probablement encore très lente pour 5 millions de fichiers.