60000 bukan apa-apa, 20000 juga. Tetapi Anda harus mengelompokkan 20.000 ini dengan cara apa pun untuk mempercepat akses ke sana. Mungkin dalam kelompok 100 atau 1000, dengan mengambil nomor direktori dan membaginya dengan 100, 500, 1000, terserah.
E.g., saya punya proyek di mana file memiliki nomor. Saya mengelompokkannya dalam 1000-an, jadi saya punya
id/1/1332
id/3/3256
id/12/12334
id/350/350934
Anda sebenarnya mungkin memiliki batas keras - beberapa sistem memiliki inode 32 bit, jadi Anda dibatasi hingga 2^32 per sistem file.
Jika sistem file server Anda memiliki dir_index
fitur diaktifkan (lihat tune2fs(8)
untuk perincian tentang pemeriksaan dan pengaktifan fitur) maka Anda dapat menyimpan hingga 100.000 file dalam direktori sebelum kinerja menurun. (dir_index
telah menjadi default untuk sistem file baru untuk sebagian besar distribusi selama beberapa tahun sekarang, jadi itu hanya akan menjadi lama filesystem yang tidak mengaktifkan fitur ini secara default.)
Yang mengatakan, menambahkan level direktori lain untuk mengurangi jumlah file dalam direktori dengan faktor 16 atau 256 akan secara drastis meningkatkan kemungkinan hal-hal seperti ls *
bekerja tanpa over-running maksimum argv
kernel ukuran.
Biasanya, ini dilakukan dengan sesuatu seperti:
/a/a1111
/a/a1112
...
/b/b1111
...
/c/c6565
...
yaitu, menambahkan huruf atau angka ke jalur, berdasarkan beberapa fitur yang dapat Anda hitung dari namanya. (Dua karakter pertama dari md5sum
atau sha1sum
dari nama file adalah salah satu pendekatan umum, tetapi jika Anda memiliki id objek yang unik, maka 'a'+ id % 16
mekanisme yang cukup mudah untuk menentukan direktori mana yang akan digunakan.)
ext[234] filesystem memiliki jumlah inode maksimum yang tetap; setiap file atau direktori membutuhkan satu inode. Anda dapat melihat jumlah dan batasan saat ini dengan df -i
. Misalnya, pada filesystem ext3 15GB, dibuat dengan pengaturan default:
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/xvda 1933312 134815 1798497 7% /
Tidak ada batasan pada direktori khususnya di luar ini; perlu diingat bahwa setiap file atau direktori memerlukan setidaknya satu blok sistem file (biasanya 4KB), meskipun itu adalah direktori dengan hanya satu item di dalamnya.
Seperti yang Anda lihat, 80.000 inode tidak mungkin menjadi masalah. Dan dengan dir_index
opsi (diaktifkan dengan tune2fs
), pencarian di direktori besar bukanlah masalah besar. Namun, perhatikan bahwa banyak alat administratif (seperti ls
atau rm
) dapat mengalami kesulitan menangani direktori dengan terlalu banyak file di dalamnya. Karena itu, disarankan untuk membagi file Anda sehingga Anda tidak memiliki lebih dari beberapa ratus hingga seribu item dalam direktori tertentu. Cara mudah untuk melakukannya adalah dengan melakukan hash pada ID apa pun yang Anda gunakan, dan menggunakan beberapa digit heksadesimal pertama sebagai direktori perantara.
Misalnya, Anda memiliki ID item 12345, dan di-hash menjadi 'DEADBEEF02842.......'
. Anda mungkin menyimpan file Anda di bawah /storage/root/d/e/12345
. Anda sekarang telah memotong jumlah file di setiap direktori sebesar 1/256.