Faux pas: Metode "cepat" yang saya sebutkan di bawah, tidak 60 kali lebih cepat daripada yang lambat. Ini 30 kali lebih cepat. Saya akan menyalahkan kesalahan pada jam (3:00 bukan waktu terbaik saya hari untuk berpikir jernih :) ..
Pembaruan: Saya telah menambahkan ringkasan waktu pengujian (di bawah).
Tampaknya ada dua masalah yang terlibat dengan faktor kecepatan:
- Pilihan perintah yang digunakan (Perbandingan waktu ditunjukkan di bawah ini)
- Sifat sejumlah besar file dalam direktori ... Tampaknya "besar itu buruk". Hal-hal menjadi lambat secara tidak proporsional karena jumlahnya meningkat ..
Semua tes telah dilakukan dengan 1 juta file.
(waktu nyata, pengguna, dan sistem ada dalam skrip pengujian)
Skrip pengujian dapat ditemukan di paste.ubuntu.com
#
# 1 million files
# ===============
#
# |time |new dir |Files added in ASCENDING order
# +---- +------- +-------------------------------------------------
# real 01m 33s Add files only (ASCENDING order) ...just for ref.
# real 02m 04s Add files, and make 'rm' source (ASCENDING order)
# Add files, and make 'rm' source (DESCENDING order)
# real 00m 01s Count of filenames
# real 00m 01s List of filenames, one per line
# ---- ------- ------
# real 01m 34s 'rm -rf dir'
# real 01m 33s 'rm filename' via rm1000filesPerCall (1000 files per 'rm' call)
# real 01m 40s 'rm filename' via ASCENDING algorithm (1000 files per 'rm' call)
# real 01m 46s 'rm filename' via DESCENDING algorithm (1000 files per 'rm' call)
# real 21m 14s 'rm -r dir'
# real 21m 27s 'find dir -name "hello*" -print0 | xargs -0 -n 1000 rm'
# real 21m 56s 'find dir -name "hello*" -delete'
# real 23m 09s 'find dir -name "hello*" -print0 | xargs -0 -P 0 rm'
# real 39m 44s 'rm filename' (one file per rm call) ASCENDING
# real 47m 26s 'rm filename' (one file per rm call) UNSORTED
#
Saya baru-baru ini membuat dan menghapus 10 juta file tes kosong. Menghapus file berdasarkan nama berdasarkan nama (yaitu rm filename
), saya menemukan cara yang sulit bahwa ada perbedaan waktu yang sangat besar antara 2 metode yang berbeda ...
Kedua metode menggunakan rm filename
perintah yang sama persis .
Pembaruan: ternyata, perintahnya tidak persis sama ... Salah satunya mengirim 1000 nama file sekaligus ke 'rm' ... Itu adalah masalah perluasan-penahan shell di mana saya pikir setiap nama file ditulis ke file feeder pada barisnya sendiri, tetapi sebenarnya itu 1000 per baris
Nama file diberikan melalui 'file pengumpan' ke dalam satu while read
lingkaran ..
File pengumpan adalah output dari ls -1 -f
Metode ini identik dalam semua pemanggilan kembali, kecuali untuk satu hal:
- yang lambat metode menggunakan file pengumpan disortir langsung dari
ls -1 -f
- yang cepat metode menggunakan versi diurutkan dari file disortir sama
Saya tidak yakin apakah pengurutan masalah ini di sini, atau mungkin file pengumpan yang disortir kebetulan cocok dengan urutan di mana file dibuat (saya menggunakan algoritma integer ascending sederhana)
Untuk 1 juta file, metode cepat rm filename
adalah 60 kali lebih cepat daripada metode lambat ... sekali lagi, saya tidak tahu apakah ini masalah "pengurutan", atau masalah tabel hash di belakang layar ... Saya menduga itu bukan masalah sederhana menyortir, karena mengapa ls -1 -f
sengaja memberi saya unsort daftar dari baru ditambahkan "diurutkan" urutan nama file ...
Saya hanya ingin tahu apa yang sedang terjadi di sini, jadi saya tidak perlu berhari-hari (ya berhari-hari) untuk menghapus 10 juta file berikutnya :) .... Saya mengatakan "hari" karena saya mencoba banyak alternatif, dan kali yang terlibat meningkat secara tidak proporsional ke jumlah file yang terlibat .. jadi saya hanya menguji 1 juta secara detail
BTW: Menghapus file melalui "daftar daftar" nama sebenarnya lebih cepat daripada rm -rf
dengan faktor 2.
dan: rm -r
30 kali lebih lambat dari metode "daftar disortir"
... tetapi apakah "beres" masalah di sini? atau itu lebih terkait dengan metode penyimpanan hashing (atau apa pun) yang digunakan oleh ext4?
Hal yang cukup membingungkan saya adalah bahwa setiap panggilan rm filename
tidak terkait dengan yang sebelumnya .. (yah, setidaknya itu seperti itu dari perspektif 'bash')
Saya menggunakan drive Ubuntu / bash / 'ext4' / SATA II.
sumber
find -delete
?cat
ke file baru sebelum tes 1 - menggantikansort
tes 2.Jawaban:
rm -r diharapkan lambat karena bersifat rekursif. Traversal pertama yang mendalam harus dibuat pada struktur direktori.
Sekarang bagaimana Anda membuat 10 juta file? Apakah Anda menggunakan beberapa skrip yang loop pada beberapa pesanan? 1.txt, 2.txt, 3.txt ... jika ya maka file-file itu juga dapat dialokasikan pada urutan yang sama dalam blok yang sesuai di hdd.so menghapus pada urutan yang sama akan lebih cepat.
"ls -f" akan mengaktifkan -aU yang berisi daftar dalam urutan direktori yang lagi-lagi bersifat rekursif.
sumber
Anda harus mengoptimalkan struktur file. Jadi, bukannya
lakukan sesuatu yang lebih pintar seperti (diasumsikan bash):
Sekarang contoh ini agak lambat karena penggunaan md5sum [1], gunakan sesuatu seperti yang berikut ini untuk respons yang jauh lebih cepat, selama Anda tidak memerlukan nama file tertentu, duplikat tidak menjadi masalah dan tidak perlu untuk hash berulang dari nama tertentu :)
Tentu saja ini semua konsep pinjaman sembarangan dari hashtables
sumber