Как хранить миллионы картинок размером около 2к каждая

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

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


person alchemical    schedule 02.04.2010    source источник


Ответы (5)


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

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

У вас также могут быть архивы, содержащие связанные изображения, чтобы загружать их только с одним открытым файлом. Эти архивы могут быть сжаты, если узким местом является ввод-вывод, несжатыми, если это процессор.

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

person Guillaume    schedule 02.04.2010

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

person Juha Syrjälä    schedule 02.04.2010

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

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

person Marc Climent    schedule 02.04.2010

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

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

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

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

person Mark Lutton    schedule 02.04.2010
comment
Хотя код может читать файл в каталоге с очень большим количеством файлов, это все же не лучшая идея. Если вы когда-либо пытались открыть в проводнике каталог с несколькими тысячами файлов, это очень медленно. Хеширование в подкаталоги очень помогает в этом. - person Kleinux; 02.04.2010
comment
Медлительность в проводнике, вероятно, больше связана с тем, что Explorer пытается сделать со всеми этими именами файлов, а не с получением самих имен файлов. Чтобы прочитать все файлы и, например, показать эскизы, потребуется много времени. Получение отдельного файла, если вы уже знаете имя файла, должно быть быстрым. Если вы напишете свою собственную систему для хранения и извлечения файлов, вы можете получить или не получить лучшую производительность, чем NTFS. - person Mark Lutton; 05.04.2010

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

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

person Doug R    schedule 02.04.2010