Penjelasan Teknis
Alasan bahwa sebagian besar metode menyebabkan masalah adalah bahwa Windows mencoba untuk menghitung file dan folder. Ini bukan masalah besar dengan beberapa ratus — atau bahkan ribuan — file / folder sedalam beberapa level, tetapi ketika Anda memiliki triliunan file dalam jutaan folder yang mencapai puluhan level dalam, maka itu pasti akan membuat sistem macet. .
Mari Anda memiliki "hanya" 100.000.000 file, dan Windows menggunakan struktur sederhana seperti ini untuk menyimpan setiap file beserta path-nya (dengan cara itu Anda menghindari menyimpan setiap direktori secara terpisah, sehingga menghemat beberapa overhead):
struct FILELIST { // Total size is 264 to 528 bytes:
TCHAR name[MAX_PATH]; // MAX_PATH=260; TCHAR=1 or 2 bytes
FILELIST* nextfile; // Pointers are 4 bytes for 32-bit and 8 for 64-bit
}
Bergantung pada apakah ia menggunakan karakter 8-bit atau karakter Unicode (menggunakan Unicode) dan apakah sistem Anda 32-bit atau 64-bit, maka diperlukan memori antara 25GB dan 49GB untuk menyimpan daftar (dan ini sangat struktur yang disederhanakan).
Alasan mengapa Windows mencoba untuk menghitung file dan folder sebelum menghapusnya bervariasi tergantung pada metode yang Anda gunakan untuk menghapusnya, tetapi Explorer dan interpreter perintah melakukannya (Anda dapat melihat penundaan saat Anda memulai perintah). Anda juga dapat melihat flash aktivitas disk (HDD LED) saat membaca pohon direktori dari drive.
Larutan
Taruhan terbaik Anda untuk menghadapi situasi semacam ini adalah dengan menggunakan alat hapus yang menghapus file dan folder satu per satu, satu per satu. Saya tidak tahu apakah ada alat siap pakai untuk melakukannya, tetapi harus mungkin untuk mencapai dengan sederhana batch-file tersebut.
@echo off
if not [%1]==[] cd /d %1
del /q *
for /d %%i in (*) do call %0 "%%i"
Apa yang dilakukan adalah memeriksa apakah argumen telah disetujui. Jika demikian, maka itu berubah ke direktori yang ditentukan (Anda dapat menjalankannya tanpa argumen untuk memulai di direktori saat ini atau menentukan direktori — bahkan pada drive lain untuk memulainya di sana).
Selanjutnya, itu menghapus semua file di direktori saat ini. Dalam mode ini, seharusnya tidak menghitung apa pun dan cukup menghapus file tanpa menyedot banyak, jika ada, memori.
Kemudian ia menyebutkan folder di direktori saat ini dan memanggil dirinya sendiri, meneruskan setiap folder ke sana (sendiri) untuk muncul kembali ke bawah.
Analisis
Alasan ini harus bekerja adalah karena ia tidak menyebutkan setiap file dan folder tunggal di seluruh pohon . Itu tidak menyebutkan file sama sekali, dan hanya menyebutkan folder di direktori saat ini (ditambah yang tersisa di direktori induk). Dengan asumsi hanya ada beberapa ratus sub-direktori dalam folder yang diberikan, maka ini seharusnya tidak terlalu buruk, dan tentu saja membutuhkan memori jauh lebih sedikit daripada metode lain yang menyebutkan seluruh pohon.
Anda mungkin bertanya-tanya tentang menggunakan /r
sakelar alih-alih menggunakan rekursi (manual). Itu tidak akan berhasil karena ketika /r
switch melakukan rekursi, ia melakukan pre-enumerasi seluruh pohon direktori yang persis apa yang ingin kita hindari; kami ingin menghapus saat kami pergi tanpa melacak.
Perbandingan
Mari kita bandingkan metode ini dengan metode enumerasi penuh.
Anda telah mengatakan bahwa Anda memiliki "jutaan direktori"; katakanlah 100 juta. Jika pohon kira-kira seimbang, dan dengan asumsi rata-rata sekitar 100 sub-direktori per folder, maka direktori bersarang paling dalam akan sekitar empat tingkat ke bawah — sebenarnya, akan ada 101.010.100 sub-folder di seluruh pohon. (Lucu bagaimana 100M dapat dipecah menjadi hanya 100 dan 4.)
Karena kita tidak menghitung file, kita hanya perlu melacak paling banyak 100 nama direktori per level, untuk maksimum 4 × 100 = 400
direktori pada waktu tertentu.
Oleh karena itu persyaratan memori harus ~ 206.25KB, baik dalam batas-batas sistem modern (atau lainnya).
Uji
Sayangnya (?) Saya tidak memiliki sistem dengan triliunan file di jutaan folder, jadi saya tidak dapat mengujinya (saya percaya pada hitungan terakhir, saya memiliki sekitar ~ 800 ribu file), jadi orang lain harus mencoba Itu.
Peringatan
Tentu saja ingatan bukan satu-satunya batasan. Drive akan menjadi hambatan besar juga karena untuk setiap file dan folder yang Anda hapus, sistem harus menandainya sebagai gratis. Untungnya, banyak dari operasi disk ini akan dibundel bersama (di-cache) dan ditulis dalam potongan-potongan alih-alih secara individual (setidaknya untuk hard drive, bukan untuk media yang dapat dilepas), tetapi masih akan menyebabkan sedikit kehancuran ketika sistem membaca dan menulis data.