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

StackOverflow https://stackoverflow.com/questions/2567597

Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top