Saya memiliki direktori yang memiliki sekitar 5 juta file. Ketika saya mencoba menjalankan ls
perintah dari dalam direktori ini, sistem saya menghabiskan banyak sekali memori dan hang setelah beberapa saat. Apakah ada cara efisien untuk mendaftar file selain menggunakan ls
perintah?
70
ls
penggunaan itu--color
atau-F
karena artinya melakukanlstat(2)
untuk setiap file.ls
panggilan murni atau apakah Anda menggunakan opsi?Jawaban:
Hindari penyortiran dengan menggunakan:
Atau, yang setara:
sumber
-1
bendera dapat membantu.-1
membutuhkan waktu lebih lama.-C
ketika stdout adalah terminal,-1
ketika itu pipa) membingungkan. Saat Anda bereksperimen dan mengukur, Anda beralih antara melihat output (untuk memastikan perintah melakukan apa yang Anda harapkan) dan menekannya (untuk menghindari faktor perancu dari throughput aplikasi terminal). Lebih baik menggunakan perintah yang berperilaku dengan cara yang sama di kedua mode, sehingga secara eksplisit menentukan format output melalui-1
,-C
,-l
, dllls
sebenarnya mengurutkan file dan mencoba untuk membuat daftar yang menjadi overhead besar jika kita mencoba mendaftar lebih dari satu juta file di dalam direktori. Seperti disebutkan dalam tautan ini , kita dapat menggunakanstrace
ataufind
untuk membuat daftar file. Namun, opsi-opsi itu juga tampak tidak mungkin untuk masalah saya karena saya memiliki 5 juta file. Setelah sedikit googling, saya menemukan bahwa jika kita daftar direktori menggunakangetdents()
, itu seharusnya lebih cepat, karenals
,find
danPython
perpustakaan menggunakanreaddir()
yang lebih lambat tetapi menggunakan digetdents()
bawahnya.Kita dapat menemukan kode C untuk membuat daftar file yang digunakan
getdents()
dari sini :Salin program C di atas ke dalam direktori di mana file harus terdaftar. Kemudian jalankan perintah di bawah ini.
Contoh waktu :
getdents
bisa lebih cepat daripadals -f
, tergantung pada konfigurasi sistem. Berikut adalah beberapa pengaturan waktu yang menunjukkan peningkatan kecepatan 40x untuk daftar direktori yang berisi sekitar 500k file di atas mount NFS di cluster komputasi. Setiap perintah dijalankan 10 kali berturut-turut, pertamagetdents
, laluls -f
. Jalankan pertama secara signifikan lebih lambat dari yang lain, mungkin karena kesalahan halaman caching NFS. (Selain: di atas mount ini,d_type
bidang ini tidak dapat diandalkan, dalam arti bahwa banyak file muncul sebagai tipe "tidak dikenal".)sumber
ls
?getdents
vs ini tidakreaddir
tepat.Alasan yang paling mungkin mengapa lambat adalah pewarnaan jenis file, Anda dapat menghindari ini dengan
\ls
atau/bin/ls
mematikan opsi warna.Jika Anda benar-benar memiliki begitu banyak file dalam suatu dir, menggunakan
find
gantinya juga merupakan pilihan yang baik.sumber
ls -U --color
akan memakan waktu lama karena akanstat
setiap file. Jadi keduanya benar.ls
dan itu secara default di banyak banyak.bashrc
di luar sana./bin/ls -U
dan mendapatkan hasil dalam waktu singkat, dibandingkan dengan menunggu sangat lama sebelumnyaSaya menemukan bahwa
echo *
bekerja jauh lebih cepat daripada ls. YMMV.sumber
*
. Jadi cara ini mungkin masih sangat lambat untuk 5 juta file.