Saya memiliki aplikasi yang menulis ke direktori ext3 yang seiring waktu telah berkembang menjadi sekitar tiga juta file. Tak perlu dikatakan, membaca daftar file direktori ini lambat sekali.
Saya tidak menyalahkan ext3. Solusi yang tepat adalah membiarkan kode aplikasi menulis ke sub-direktori seperti ./a/b/c/abc.ext
daripada hanya menggunakan ./abc.ext
.
Saya mengubah struktur sub-direktori seperti itu dan pertanyaan saya sederhana: kira-kira berapa banyak file yang harus saya simpan di satu direktori ext3 sambil tetap mendapatkan kinerja yang dapat diterima? Apa pengalaman anda
Atau dengan kata lain; dengan asumsi bahwa saya perlu menyimpan tiga juta file dalam struktur, berapa banyak level ./a/b/c/abc.ext
struktur seharusnya?
Jelas ini adalah pertanyaan yang tidak bisa dijawab dengan tepat, tapi saya mencari perkiraan ball park.
http://en.wikipedia.org/wiki/Ext3#Functionality - Ini menyebutkan bahwa direktori hanya dapat memiliki sekitar 32000 subdirektori, tetapi tidak menyebutkan file.
http://roopindersingh.com/2008/05/10/ext3-handling-large-number-of-files-in-a-ddirectory/
Juga, saya membenci Experts Exchange, tetapi saya membaca komentar pada pertanyaan ini bahwa ideal untuk memiliki kurang dari 10-15.000 per direktori.
sumber
Saya dapat mengkonfirmasi pada server yang cukup kuat dengan banyak memori di bawah beban yang layak bahwa 70.000 file dapat menyebabkan semua jenis kekacauan. Saya pergi untuk menghapus folder cache dengan 70k file di dalamnya dan itu menyebabkan apache untuk mulai memunculkan instance baru sampai maxed out pada 255 dan sistem menggunakan semua memori bebas (16gb meskipun virtual instance mungkin lebih rendah). Bagaimanapun, mempertahankannya di bawah 25.000 mungkin merupakan langkah yang sangat bijaksana
sumber
Dalam pengalaman saya, pendekatan terbaik adalah tidak terlalu-insinyur struktur file di muka. Seperti disebutkan dalam setidaknya satu jawaban lain, ada ekstensi filesystem yang berhubungan dengan akhir masalah kinerja.
Masalah yang lebih sering saya temui adalah kegunaan pada bagian administrasi. Jumlah pekerjaan paling sedikit yang dapat Anda lakukan untuk mengurangi jumlah file dalam direktori mungkin adalah pendekatan yang Anda butuhkan saat ini.
sqrt (3_000_000) == 1732
Beberapa ribu file dalam satu direktori terdengar masuk akal bagi saya. Jadilah hakim sendiri untuk situasi Anda sendiri. Untuk mencapai ini, coba pisahkan file menjadi satu tingkat direktori hash sehingga jumlah rata-rata file per direktori hampir sama dengan jumlah direktori.
Mengingat contoh Anda ini akan menjadi
./a/abc.ext
,./ab/abc.ext
,./abc/abc.ext
, ....Penyebaran file akan sangat bergantung pada nama file yang sebenarnya. Bayangkan menerapkan teknik ini ke direktori sejuta file yang masing-masing dinamai
foobar???.txt
. Ada beberapa cara untuk mencapai penyebaran yang lebih merata, seperti hashing berdasarkan nilai sejumlah bit tertentu dari jumlah MD5 dari setiap nama file, tetapi saya akan berani menebak bahwa itu akan berlebihan untuk apa yang ingin Anda capai.sumber
Hmm, saya membaca artikel ini baru-baru ini . Pada dasarnya Anda memanfaatkan distribusi algoritma hashing favorit Anda. Saya mulai bermain dengan angka-angka, INT MySQL yang ditandatangani memiliki nilai maksimum 2147483647. Anda juga dapat memvariasikan jumlah file yang diinginkan per direktori dan jumlah subdirektori untuk menyelesaikan jumlah akhir dari sub-direktori / file- perpecahan per-direktori untuk kumpulan data yang diberikan, tetapi sulit untuk menemukan bukti empiris pada direktori / file organisasi yang optimal. Artikel ini memang memberikan beberapa wawasan tentang perbedaan kinerja di seluruh sistem file (beberapa metrik yang menarik), tetapi tidak ada tentang organisasi yang optimal.
sumber
Saya pikir Anda terlalu memikirkan ini. Jika Anda bahkan memilih satu tingkat direktori tambahan dan dapat menyeimbangkan semuanya secara merata, Anda akan memiliki 1732 * direktori dan 1732 file per direktori.
Kecuali Anda berencana membutuhkan puluhan miliar file, Anda dapat memilih angka antara 1000 dan 100.000 dan mendapatkan hasil yang baik.
* akar kuadrat dari 3 juta.
sumber