Сохранение изображений в подкаталоги

Forever

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

Наверное, для вас эти вопросы могут показаться абсурдными, поэтому я готов принять все летящие помидоры .

Так вот. Отрывок из одной статьи (http://epsiloncool.ru/programmirovanie/php/optimalnyj-sposob-xraneniya-bolshogo-kolichestva-fajlov):


"Ошибка номер 3: сваливать все изображения в одну папку.

Почему и как быть? => Некоторые операционные системы (и Linux тоже) начинают сильно тормозить при доступе в папку, в которой хранится 100 тысяч файлов и более. Идеально, если в каждой папке будет не больше 1000 файлов.

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

/ f7 / 89 / f789abc898d6892df98d09a8f8.jpg

Вы видите, что первый уровень подпапки повторяет первые 2 символа имени файла, а второй — следующие два символа. Количество уровней при желании можно увеличивать.

Это гарантирует количество подпапок в каждой папке не более 256 штук, и статистически количество файлов в каждой конечной подпапке будет делиться на 65 тысяч. То есть, при количестве файлов 1 миллион в каждой подпапке окажется по 10-20 файлов. Три уровня вложенности делят это количество на 16 миллионов, чего должно хватить для любых нужд."


И вот чего я не понял:

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

2) / f7 / 89 / f789abc898d6892df98d09a8f8.jpg - зачем нужна промежуточная папка 89? Это ведь просто лишнее звено .

3) И вот тут совсем жесть для меня:
Цитата
f7 / 89 / f789abc898d6892df98d09a8f8.jpg - Это гарантирует количество подпапок в каждой папке не более 256 штук.
- почему?

Цитата
и статистически количество файлов в каждой конечной подпапке будет делиться на 65 тысяч.
- почему?

4)

К примеру, я делаю все простым способом без разбиения на подпапки:
создаю основную папку photos, в ней подпапки для каждого пользователя. В каждой подпапке сохраняю все фотографии этого пользователя. Вроде как
photos/user_1/img0.jpg
photos/user_1/img1.jpg
photos/user_1/img2.jpg

Или делаю, как написано выше:
photos/user_1/ha/sh/hash_izobrajeniya1.jpg
photos/user_1/ha/sh/hash_izobrajeniya1.jpg
photos/user_1/ha/sh/hash_izobrajeniya1.jpg

Объясните пожалуйста, чем эти два способа отличаются? Как наличие двух подпапок во втором случае дают все эти самые бонусы из статьи?
 

Adelf

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

f7 / 89 / f789abc898d6892df98d09a8f8.jpg - Это гарантирует количество подпапок в каждой папке не более 256 штук.
- почему?

Потому что первые два символа в шестнадцатеричной системе записаны. И число возможных вариантов данного числа - 256. Из 257 файлов.. как минимум у двух эти два символа совпадут. Тебе не хватает конечно... образования математического немного.
 

Hello

Новичок
1) Если в одной папке накопится более 1000 подпапок, то это равносильно наличию 1000 файлов в этой папке? И если да, то какой тогда смысл в подпапке для каждого файла?

3) И вот тут совсем жесть для меня:
Цитата
f7 / 89 / f789abc898d6892df98d09a8f8.jpg - Это гарантирует количество подпапок в каждой папке не более 256 штук.
- почему?
Первый противоречат третьему.
Ответ на 3 - md5 возращает в 16 системе счисления, если делим по 2 символа, то получаем 16*16 = 256

2) / f7 / 89 / f789abc898d6892df98d09a8f8.jpg - зачем нужна промежуточная папка 89? Это ведь просто лишнее звено .
Уменьшает максимальное количество файлов в конечной папке в 256 раз
и статистически количество файлов в каждой конечной подпапке будет делиться на 65 тысяч.
- почему?
256 * 256 = 65535

создаю основную папку photos, в ней подпапки для каждого пользователя. В каждой подпапке сохраняю все фотографии этого пользователя. Вроде как
Если пользователь зальёт 5 миллионов файлов, то даже открытие одного файла из папки этого пользователя будет тормозить
 

antson

Новичок
Партнер клуба
@Forever, номер юзера в лоб - это та же проблема только в профиль ;)
вот будет 15 тысяч пользователей , и тормоза
если миллиона достаточно , то можно раскладывать по тысяче
код ниже по KISS принципу , а не для максимальной скорости
function userdir($x){
$x=substr('0000000'.$x,-6); //выравниваем на 6 знаков
return substr($x,0,3).'/'.substr($x,3,3); // а теперь по 1000 папок в папке
}
так же можно поступать с ид фотографий,
например у тебя товары , то их картинки можно привязать жестко к ид записи
допустим у товара может быть до 10 картинок
тогда
/upload/goods/000/001_0.jpg
...
/upload/goods/000/001_9.jpg

а завязываться на мд5 удобно только для случая аплоада в блоги или другие там проекты, когда любой юзер может загружать, ну или в случае, когда при перезаливке иллюстрации на серваке должна остаться архивная копия.
в остальном имхо лучше раскладывать по папкам назначения
assets - это дизайнерский обвес
photos или img - загруженные из админки сайта
upload - юзерские

но последнее, мое глубокое имхо. Которое может не совпадать со сложившейся практикой конторы в которой будешь работать
 
Сверху