Miałem katalog zawierający około 5 milionów plików. Kiedy próbowałem uruchomić ls
polecenie z tego katalogu, mój system zużył ogromną ilość pamięci i po pewnym czasie się zawiesił. Czy istnieje skuteczny sposób na wyświetlenie listy plików inny niż użycie ls
polecenia?
70
ls
, który używa--color
lub-F
jako oznaczałoby to robilstat(2)
dla każdego pliku.ls
rozmowa, czy korzystałeś z opcji?Odpowiedzi:
Unikaj sortowania, używając:
Lub równoważnie:
źródło
-1
flagi może pomóc.-1
to trwa jeszcze dłużej.-C
gdy stdout jest terminalem,-1
gdy jest potokiem) jest mylące. Podczas eksperymentowania i mierzenia przełączasz się między widokiem wyników (aby upewnić się, że polecenie wykonuje to, czego oczekujesz) a pomijaniem go (aby uniknąć mylącego współczynnika przepustowości aplikacji terminalowej). Lepiej użyć komendy, które zachowują się w ten sam sposób w obu trybach, więc jednoznacznie określić format wyjściowy poprzez-1
,-C
,-l
, itd.ls
faktycznie sortuje pliki i próbuje je wyświetlić, co staje się ogromnym narzutem, jeśli próbujemy wyświetlić ponad milion plików w katalogu. Jak wspomniano w tym linku, możemy użyćstrace
lubfind
wyświetlić listę plików. Jednak te opcje również wydawały się niewykonalne dla mojego problemu, ponieważ miałem 5 milionów plików. Po trochę googlingu, odkryłem, że jeśli wymienimy listę używanych katalogówgetdents()
, powinno to być szybsze, ponieważls
,find
iPython
biblioteki używają tego,readdir()
co jest wolniejsze, ale używagetdents()
pod spodem.Możemy znaleźć kod C, aby wyświetlić listę plików przy użyciu
getdents()
od tutaj :Skopiuj powyższy program C do katalogu, w którym pliki muszą być wymienione. Następnie wykonaj poniższe polecenia.
Przykład taktowania :
getdents
może być znacznie szybszy niżls -f
, w zależności od konfiguracji systemu. Oto niektóre czasy pokazujące 40-krotny wzrost prędkości dla umieszczenia katalogu zawierającego około 500 tys. Plików przez podłączenie NFS w klastrze obliczeniowym. Każda komenda został uruchomiony 10 razy w bezpośredniej kolejności, najpierwgetdents
, potemls -f
. Pierwsze uruchomienie jest znacznie wolniejsze niż wszystkie inne, prawdopodobnie z powodu błędów strony buforowania NFS. (Poza tym: w przypadku tego montażud_type
pole jest niewiarygodne, w tym sensie, że wiele plików jest wyświetlanych jako „nieznane”).źródło
ls
?getdents
kontrareaddir
nie ma sensu.Najbardziej prawdopodobnym powodem dlaczego jest powolny jest typ pliku farbowanie, można tego uniknąć z
\ls
lub/bin/ls
wyłączenie opcji kolorów.Jeśli naprawdę masz tyle plików w katalogu,
find
dobrym rozwiązaniem jest użycie zamiast tego.źródło
ls -U --color
zajęłoby dużo czasu, ponieważ dotyczyłobystat
każdego pliku. Więc oba są poprawne.ls
i jest domyślnie aliasowane w wielu wielu urządzeniach.bashrc
./bin/ls -U
i dostałem wyjście w krótkim czasie, w porównaniu do czekania bardzo długo wcześniejUważam, że
echo *
działa znacznie szybciej niż ls. YMMV.źródło
*
. Więc ten sposób jest prawdopodobnie nadal bardzo wolny dla 5 milionów plików.