2012-02-17 2 views
4

Я кодирую базовую галерею для сайта с примерно 40 000 онлайн-пользователей в любое время. Пользователи смогут создавать галереи и загружать изображения.Каков наиболее эффективный способ хранения 500 000 изображений?

Вопрос в том, должен ли я сделать отдельную папку для каждой галереи и поместить в нее изображения, или создать одну папку и поместить в нее все изображения, но сохранить галерею для каждого изображения в базе данных? Или, должен ли я создать каталог для каждого пользователя, а затем другой каталог внутри них для имен галереи?

Как вы это сделаете?

Пс. Мне нужно, чтобы он был как можно более легким.

+1

Что такое ОС и файловая система? –

+0

Linux. (Cent OS) Я не знаю файловую систему, так как у меня нет доступа к их серверу. – Aristona

+1

Я бы предпочел использовать amazon s3 и их API, не сохраняя никаких папок и только используя реляционную таблицу в базе данных, чтобы отслеживать их. –

ответ

8

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

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

/photos/1/0/3/103456.jpg 
/photos/9/4/1/941000.jpg 
/photos/0/0/0/000001.jpg 

Вы можете сохранить отношения фото к пользовательскому/галерея/и т.д. в базе данных

Или, если вы хотите увидеть, как большие мальчики делают это

Needle in a haystack: efficient storage of billions of photos

+1

+1 это хороший ответ, но я бы рекомендовал использовать хеш-функцию, как я сказал в своем ответе, чтобы убедиться, что идентификаторы равномерно распределены, и вы не получаете слишком много файлов в одной папке. – hackartist

+1

Отличное предложение. Разделение его таким образом позволяет разделить на будущую дату. Например, первая цифра может быть сервером, а не каталогом. Я управляю сайтом с более чем 10 миллионами изображений, и мы используем аналогичную настройку. –

+0

Большое спасибо, отметили ваш ответ как ответ. – Aristona

3

Обычно веб-серверы не хотят, чтобы вы больше, чем несколько тысяч изображений в одной папке (я недавно имел дело с 70000 изображения, вызывающие супер медленное чтение и сортировка, так что доверяйте мне на это), поэтому, конечно, не одна папка, если вы думаете, что у вас будет тысячи изображений. Я бы предположил, что лучшим решением было бы отключить S3 Amazon, подключенный к их CDN CloudFront, но если это нереально, вы все равно можете сделать несколько вещей только на своем собственном сервере.

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

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

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

0

хранить мину так:

images/userid/photoid 

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

Смежные вопросы