У меня есть приложение, пишущее в каталог ext3, которое со временем выросло примерно до трех миллионов файлов. Излишне говорить, что чтение списка файлов этого каталога невыносимо медленно.
Я не виню ext3. Правильным решением было бы позволить коду приложения записывать в подкаталоги, такие как, ./a/b/c/abc.ext
а не использовать только ./abc.ext
.
Я перехожу на такую структуру подкаталогов, и мой вопрос прост: примерно, сколько файлов мне следует хранить в одном каталоге ext3, при этом сохраняя приемлемую производительность? Какой у тебя опыт?
Или другими словами; при условии, что мне нужно хранить три миллиона файлов в структуре, сколько уровней должно ./a/b/c/abc.ext
быть в структуре?
Очевидно, что это вопрос, на который нельзя ответить точно, но я ищу оценку парка мячей.
http://en.wikipedia.org/wiki/Ext3#Functionality - здесь упоминается, что каталог может содержать только приблизительно 32000 подкаталогов, но не упоминаются файлы.
http://roopindersingh.com/2008/05/10/ext3-handling-large-number-of-files-in-a-directory/
Кроме того, я ненавижу Experts Exchange, но читаю комментарий по этому вопросу, что идеально иметь менее 10-15 000 на каталог.
источник
На довольно мощном сервере с достаточным объемом памяти при приличной нагрузке я могу подтвердить, что 70000 файлов могут вызвать разного рода разрушения. Я пошел, чтобы удалить папку кэша с 70k-файлами в ней, и это заставило apache начать порождать новые экземпляры, пока не достигнет максимального значения 255, и система использовала всю свободную память (16 ГБ, хотя виртуальный экземпляр мог быть меньше). В любом случае, держать его под 25000, вероятно, очень разумный шаг
источник
По моему опыту, лучший подход - не перегружать структуру файла заранее. Как упомянуто по крайней мере в одном другом ответе, существуют расширения файловой системы, которые решают проблему производительности.
Проблема, с которой я сталкиваюсь чаще, заключается в удобстве использования на административном уровне. Наименьший объем работы, который вы можете сделать, чтобы уменьшить количество файлов в каталоге, - это, вероятно, тот подход, который вам нужен сейчас.
sqrt (3_000_000) == 1732
Пару тысяч файлов в одном каталоге звучит для меня разумно. Будь своим собственным судьей в своей собственной ситуации. Чтобы добиться этого, попробуйте разделить файлы на один уровень хеш-каталогов, чтобы среднее количество файлов в каталоге было примерно таким же, как количество каталогов.
Учитывая ваш пример это было бы
./a/abc.ext
,./ab/abc.ext
,./abc/abc.ext
, ....Распространение файлов будет сильно зависеть от фактических имен файлов. Представьте себе, что вы примените эту технику к каталогу с миллионами файлов с именами
foobar???.txt
. Существуют способы добиться более равномерного распределения, например, хэширование, основанное на значении определенного количества битов из суммы MD5 каждого имени файла, но я позволю себе предположить, что это будет излишним для того, что вы пытаетесь выполнить.источник
Хм, я недавно прочитал эту статью . По сути, вы используете распределение вашего любимого алгоритма хеширования. Я начал играть с числами, максимальное значение INT, подписанное MySQL, равно 2147483647. Вы также можете варьировать желаемое количество файлов в каталоге и количество подкаталогов, чтобы установить окончательное количество подкаталогов / files- разделение на каталоги для данного набора данных, но трудно найти эмпирические доказательства оптимальной организации каталогов / файлов. Эта статья дает некоторое представление о различиях в производительности между файловыми системами (некоторые интересные метрики), но ничего об оптимальных организациях.
источник
Я думаю, вы слишком много об этом думаете. Если бы вы даже выбрали один дополнительный уровень каталогов и смогли сбалансировать вещи равномерно, у вас было бы 1732 * каталогов и 1732 файла на каталог.
Если вы не планируете использовать десятки миллиардов файлов, вы можете выбрать число от 1000 до 100 000 и получить хорошие результаты.
* квадратный корень из 3 миллионов.
источник