Производительность одного огромного каталога Unix VS дерева каталогов? - PullRequest
1 голос
/ 06 декабря 2009

Мой проект PHP будет использовать тысячи картинок, и для каждого имени хранилища требуется только один номер.

Моя первоначальная идея состояла в том, чтобы поместить все картинки в один каталог и назвать файлы "0.jpg "," 1.jpg "," 2.jpg "и вплоть до" 4294967295.jpg ".

Было бы лучше с точки зрения производительности создать структуру дерева каталогов и назвать файлы как-нибудькак "429/496 / 7295.jpg"?

Если ответ положительный, то последующим вопросом будет: каково оптимальное количество подкаталогов или файлов на уровень глубины?И какое влияние на это оказывает выбранная файловая система?

Каждый файл будет иметь соответствующую запись MySQL с идентификатором UNSIGNED LONGINT.

Спасибо.

Ответы [ 4 ]

2 голосов
/ 06 декабря 2009

Да, трудно сказать, совсем немного, возможно, вам следует использовать базу данных

Общепринято считать «использовать базу данных» , но использование файловой системы - разумный план для более крупных объектов, таких как изображения.

Некоторые файловые системы имеют ограничения на количество записей в каталоге. Некоторые файловые системы не имеют какой-либо структуры данных для поиска по имени файла, но просто выполняют линейное сканирование каталога.

Оптимизации, которые вы обсуждаете, ограничены конкретными профилями среды. Знаете ли вы сейчас, на каком будущем оборудовании будет работать ваше приложение? Может ли быть хорошей идеей не подчеркивать файловую систему и создавать хорошую иерархическую структуру каталогов? Если вы сделаете это, он будет хорошо работать на любой файловой системе или сервере хранения.

1 голос
/ 06 декабря 2009

Это зависит от того, какая файловая система используется. У ext {2,3,4} есть опция dir_index, которая может быть установлена ​​при их создании, что позволяет хранить тысячи или даже миллионы файлов в одном каталоге достаточно быстро.

btrfs еще не готов к работе, но неявно поддерживает эту идею на самом базовом уровне.

Но если вы используете серии ext без dir_index или большинства других файловых систем Unix, вам нужно будет перейти к более сложной схеме, состоящей из нескольких уровней каталогов. Я бы посоветовал вам этого избежать, если сможете. Это просто добавляет много дополнительных сложностей к тому, что файловые системы должны обрабатывать разумно для вас.

Если вы делаете более сложную схему, я бы предложил закодировать число в шестнадцатеричном формате и иметь 256 файлов / каталогов на каждом уровне. Файловые системы, которые не предназначены для обработки большого количества файлов в каждом каталоге, обычно выполняют линейное сканирование. Цель состоит в том, чтобы приблизить структуру типа B-Tree самостоятельно. 2 шестнадцатеричные цифры на каждом уровне дают примерно половину 4-килобайтного (общего размера) дискового блока на уровень с общими средствами кодирования каталогов. Это почти так же хорошо, как вы получите без действительно сложной схемы, такой как кодирование ваших чисел в базе 23 или базе 24.

1 голос
/ 06 декабря 2009

Наличие нескольких тысяч файлов в одном каталоге значительно замедлит работу. Я бы сказал, что безопасное число - до 1024 файлов в каталоге, еще 512 - лучше.

0 голосов
/ 06 декабря 2009

Ответ, конечно, такой: это зависит.

В частности, это зависит от того, какую файловую систему вы используете. Например, файловые системы ext2 и ext3 имеют ограничения на количество файлов в каталоге. Эти файловые системы не смогут поместить все ваши изображения в один каталог!

Вы можете заняться чем-то другим, кроме файловой системы. В компании, в которой я работаю, потому что нам нужно было хранить много материала, мы перешли из файлового хранилища в хранилище на основе базы данных на Apache Jackrabbit .

...