Menempatkan banyak (10 juta) file dalam satu folder

17

Saya baru saja menambahkan fitur pencarian prediktif (lihat contoh di bawah) ke situs saya yang berjalan di Server Ubuntu. Ini berjalan langsung dari database. Saya ingin menyimpan hasil untuk setiap pencarian dan menggunakannya jika ada, kalau tidak buatlah.

Apakah akan ada masalah dengan saya menyimpan potensi cira 10 juta hasil dalam file terpisah dalam satu direktori? Atau apakah disarankan untuk membaginya ke dalam folder?

Contoh:

Kohjah Breese
sumber
5
Akan lebih baik untuk berpisah. Perintah apa pun yang mencoba membuat daftar isi direktori itu kemungkinan akan memutuskan untuk menembak dirinya sendiri.
muru
8
Jadi jika Anda sudah memiliki database, mengapa tidak menggunakannya? Saya yakin DBMS akan lebih mampu menangani jutaan catatan vs. sistem file. Jika Anda tidak bisa menggunakan filesystem yang Anda butuhkan untuk membuat skema pemisahan menggunakan semacam hash, pada titik ini IMHO kedengarannya seperti menggunakan DB akan lebih sedikit kerja.
roadmr
3
Opsi lain untuk caching yang sesuai dengan model Anda lebih baik mungkin memcached atau redis. Mereka adalah toko nilai kunci (sehingga mereka bertindak seperti direktori tunggal dan Anda mengakses item hanya dengan nama). Redis bersifat persisten (tidak akan kehilangan data saat di-restart) di mana memcached adalah untuk item-item sementara.
Stephen Ostermiller
2
Ada masalah ayam dan telur di sini. Pengembang alat tidak menangani direktori dengan banyak file karena orang tidak melakukannya. Dan orang tidak membuat direktori dengan banyak file karena alat tidak mendukungnya dengan baik. misalnya saya mengerti pada satu waktu (dan saya percaya ini masih benar), permintaan fitur untuk membuat versi generator os.listdirdi python ditolak mentah-mentah karena alasan ini.
Dari pengalaman saya sendiri, saya telah melihat kerusakan ketika melewati lebih dari 32k file dalam satu direktori di Linux 2.6. Tentu saja dimungkinkan untuk melewati titik ini, tetapi saya tidak akan merekomendasikannya. Cukup bagi menjadi beberapa lapisan subdirektori dan itu akan jauh lebih baik. Secara pribadi saya akan membatasi sekitar 10.000 per direktori yang akan memberi Anda 2 lapisan.
Wolph

Jawaban:

25

Apakah akan ada masalah dengan saya menyimpan sekitar 10 juta hasil potensial dalam file terpisah dalam satu direktori?

Iya. Mungkin ada lebih banyak alasan, tetapi ini saya dapat posting dari atas kepala saya:

  • tune2fsmemiliki opsi yang disebut dir_indexyang cenderung dihidupkan secara default (pada Ubuntu itu) yang memungkinkan Anda menyimpan kira-kira 100 ribu file dalam direktori sebelum Anda melihat hit kinerja. Itu bahkan tidak dekat dengan file 10m yang sedang Anda pikirkan.

  • extfilesystem memiliki jumlah inode yang tetap maksimum. Setiap file dan direktori menggunakan 1 inode. Gunakan df -iuntuk tampilan partisi dan inode Anda secara gratis. Ketika Anda kehabisan inode Anda tidak dapat membuat file atau folder baru.

  • perintah suka rmdan lsketika menggunakan wildcard memperluas perintah dan akan berakhir dengan "daftar argumen terlalu panjang". Anda harus menggunakan finduntuk menghapus atau membuat daftar file. Dan findcenderung lambat.

Atau apakah disarankan untuk membaginya ke dalam folder?

Iya. Paling pasti. Pada dasarnya Anda bahkan tidak dapat menyimpan file 10m dalam 1 direktori.

Saya akan menggunakan database. Jika Anda ingin men-cache-nya untuk situs web, lihat " solr " ("menyediakan pengindeksan, replikasi, dan kueri load-seimbang").

Rinzwind
sumber
8

Berakhir dengan masalah yang sama. Jalankan tolok ukur saya sendiri untuk mengetahui apakah Anda dapat meletakkan semuanya di folder yang sama dengan memiliki beberapa folder. Tampaknya Anda bisa dan lebih cepat!

Benchmark

Ref: https://medium.com/@hartator/benchmark-deep-directory-structure-vs-flat-directory-structure-to-store-millions-of-files-on-ext4-cac1000ca28

Hartator
sumber
1
Terima kasih, ini sangat berguna. Saya menggunakan ini di situs dan merupakan masalah nyata untuk memprogram ulang bagian ini untuk memiliki struktur direktori /abc/efg.html. Jadi saya akan pindah kembali ke direktori flat di masa depan.
Kohjah Breese
0

Pencarian biner dapat dengan mudah menangani jutaan catatan sehingga pencarian direktori tunggal tidak akan menjadi masalah. Ini akan dilakukan dengan sangat cepat.

Pada dasarnya jika Anda menggunakan sistem 32 bit, pencarian biner hingga catatan 2Gb mudah dan baik.

Berekely DB, sebuah perangkat lunak sumber terbuka, siap memungkinkan Anda untuk menyimpan hasil lengkap di bawah satu entri dan akan memiliki pencarian bawaan.

Ashok Chand Mathur
sumber