Размещение многих (10 миллионов) файлов в одной папке


17

Я только что добавил функцию интеллектуального поиска (см. Пример ниже) на свой сайт, который работает на сервере Ubuntu. Это работает прямо из базы данных. Я хочу кэшировать результат для каждого поиска и использовать его, если он существует, иначе создать его.

Могут ли быть какие-либо проблемы со мной, сохраняя потенциальные результаты cira 10 миллионов в отдельных файлах в одном каталоге? Или целесообразно разбить их на папки?

Пример:


5
Было бы лучше разделить. Любая команда, которая пытается перечислить содержимое этого каталога, скорее всего решит выстрелить сама.
Муру

8
Так что, если у вас уже есть база данных, почему бы не использовать ее? Я уверен, что СУБД сможет лучше обрабатывать миллионы записей по сравнению с файловой системой. Если вы недовольны использованием файловой системы, вам нужно придумать схему разбиения с использованием какого-то хэша, на данный момент, IMHO, похоже, что использование БД будет менее трудоемким.
roadmr

3
Другой вариант кэширования, который лучше всего подходит для вашей модели, может быть memcached или redis. Они являются хранилищами значений ключей (поэтому они действуют как единый каталог, и вы получаете доступ к элементам только по имени). Redis является постоянным (не потеряет данные при перезапуске), где memcached предназначен для более временных элементов.
Стивен Остермиллер

2
Здесь проблема курицы с яйцом. Разработчики инструментов не обрабатывают каталоги с большим количеством файлов, потому что люди этого не делают. И люди не делают каталоги с большим количеством файлов, потому что инструменты не поддерживают это хорошо. например, я понимаю, что однажды (и я верю, что это все еще верно), os.listdirпо этой причине категорически был отклонен запрос на создание версии генератора на python.

Исходя из собственного опыта, я видел сбой при просмотре 32-килобайтных файлов в одном каталоге в Linux 2.6. Конечно, можно выйти за пределы этой точки, но я бы не советовал. Просто разделите на несколько слоев подкаталогов, и это будет намного лучше. Лично я бы ограничил его до 10000 на каталог, что даст вам 2 слоя.
Вольф

Ответы:


25

Не будет ли у меня проблем с сохранением потенциальных около 10 миллионов результатов в отдельных файлах в одном каталоге?

Да. Вероятно, есть и другие причины, но я могу написать о них с головы до головы:

  • tune2fsимеет опцию с названием, dir_indexкоторая обычно включена по умолчанию (в Ubuntu это так), которая позволяет хранить примерно 100 тыс. файлов в каталоге, прежде чем вы увидите снижение производительности. Это даже не близко к 10м файлам, о которых вы думаете.

  • extфайловые системы имеют фиксированное максимальное число inode. Каждый файл и каталог использует 1 индекс. Используйте df -iдля просмотра ваших разделов и inode бесплатно. Когда у вас заканчиваются inode, вы не можете создавать новые файлы или папки.

  • Такие команды, как rmи lsпри использовании подстановочных знаков, расширяют команду и в итоге получат «список аргументов слишком длинный». Вам придется использовать, findчтобы удалить или перечислить файлы. И findимеет тенденцию быть медленным.

Или целесообразно разбить их на папки?

Да. Вероятнее всего. В принципе, вы не можете даже хранить 10м файлов в 1 каталоге.

Я бы использовал базу данных. Если вы хотите кэшировать его для веб-сайта, взгляните на « solr » («обеспечение распределенного индексирования, репликации и запросов с балансировкой нагрузки»).


8

Закончилось тем же вопросом. Запустите мои собственные тесты, чтобы узнать, можете ли вы поместить все в одну папку вместо нескольких папок. Похоже, вы можете, и это быстрее!

эталонный тест

Ссылка: https://medium.com/@hartator/benchmark-deep-directory-structure-vs-flat-directory-structure-to-store-millions-of-files-on-ext4-cac1000ca28


1
Спасибо, это очень полезно. Я использую это на сайте, и было реальной проблемой перепрограммировать эту часть, чтобы иметь /abc/efg.html структуру каталогов. Поэтому я вернусь к плоскому каталогу в будущем.
Коджа Бриз

0

Бинарный поиск может легко обрабатывать миллионы записей, поэтому поиск по одному каталогу не будет проблемой. Это будет сделано очень быстро.

В основном, если вы используете 32-битную систему, бинарный поиск до 2Гб записей прост и хорош.

Berekely DB, программное обеспечение с открытым исходным кодом, с готовностью позволит вам сохранить полный результат под одной записью и будет иметь встроенный поиск.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.