Как хранить миллионы картинок размером около 2К каждая - PullRequest
4 голосов
/ 02 апреля 2010

Мы создаем сайт ASP.Net MVC, на котором нужно хранить более 1 миллиона изображений, размером от 2 до 5 тысяч. Из предыдущего исследования, похоже, файловый сервер, вероятно, лучше, чем дБ (не стесняйтесь комментировать в противном случае).

Есть ли что-то особенное, что следует учитывать при хранении такого количества файлов? Есть ли проблемы с тем, что Windows может быстро найти фотографию, если в одной папке столько файлов? Нужно ли создавать сегментированную структуру каталогов, например, разделять их по имени файла? Было бы неплохо, если бы решение масштабировалось как минимум до 10 миллионов изображений для будущих потребностей в расширении.

Ответы [ 5 ]

5 голосов
/ 02 апреля 2010

4Kb - размер кластера по умолчанию для NTFS. Вы можете настроить эти параметры в зависимости от обычного размера изображения. http://support.microsoft.com/kb/314878

Я бы построил дерево с подкаталогами, чтобы можно было переходить с одной FS на другую: Сколько файлов я могу поместить в каталог? и избежать некоторых проблем: http://www.frank4dd.com/howto/various/maxfiles-per-dir.htm

Вы также можете иметь архивы, содержащие связанные изображения, чтобы загрузить их только с одним открытым файлом. То есть архивы могут быть сжаты, если узким местом является ввод / вывод, и несжатым, если это ЦП.

БД легче поддерживать, но медленнее ... так что решать вам!

3 голосов
/ 02 апреля 2010

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

2 голосов
/ 02 апреля 2010

Проблема не в том, что файловая система не может хранить столько файлов в каталоге, а в том, что если вы хотите получить доступ к этому каталогу с помощью проводника Windows, это займет вечность, поэтому, если вам когда-нибудь понадобится доступ к этой папке вручную Вы должны сегментировать его, например, с каталогом на каждые 2-3 первых буквы / цифры имени или даже более глубокой структурой.

Если бы вы могли разделить это на 1k папок с 1k файлами, то каждой будет более чем достаточно, и код для этого достаточно прост.

1 голос
/ 02 апреля 2010

Я бы не исключил использование сети доставки контента. Они предназначены для этой проблемы. У меня был большой успех с Amazon S3. Поскольку вы используете решение на основе Microsoft, возможно, Azure подойдет.

Существуют ли какие-то требования, которые не позволяют использовать стороннее решение?

1 голос
/ 02 апреля 2010

При условии NTFS, существует ограничение в 4 миллиарда файлов на том (2 ^ 32 - 1). Это общий предел для всех папок на томе (включая файлы операционной системы и т. Д.)

Большое количество файлов в одной папке не должно быть проблемой; NTFS использует дерево B + для быстрого поиска. Microsoft рекомендует отключить создание коротких имен файлов (функция, которая позволяет извлекать mypictureofyou.html как mypic ~ 1.htm).

Я не знаю, есть ли какое-то преимущество в производительности, если разделить их на несколько каталогов; Я предполагаю, что не будет никакого преимущества, потому что NTFS была разработана для производительности с большими каталогами.

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

...