Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Сохранение изображений в подкаталоги
 
 автор: Ramundo   (10.03.2016 в 16:10)   письмо автору
 
 

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

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

Так вот. Отрывок из одной статьи (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

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

  Ответить  
 
 автор: cheops   (10.03.2016 в 19:10)   письмо автору
 
   для: Ramundo   (10.03.2016 в 16:10)
 

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

2. Не совсем, если в папке 89 у вас лежит сотня файлов, а в папке 88 другая сотня файлов. А таких промежуточных папок в вас допустим 256, как это справедливо указано в следующем вопросе. Искать в 100 файлах сильно проще, чем в 25600 (т.е. если мы все свалим в одну кучу).

3. Потому MD5-хэш это на самом деле последовательность шестнадцатеричных чисел, которые изменяются в диапазоне от 0 до 9 и от a до f. Т.е. в десятичном числе 89 каждая из двух цифр может меняться в диапазоне от 0 до 9 (10 x 10 = 10 значений), а в шестнадцатеричных от 0 до f (16 значений). Если бы это было десятичное число, то оно менялось от 00 до 99 - 100 значений, а шестнадцатеричное изменяется от 00 до ff (16 x 16 = 256 значений). Если у вас есть инженерный калькулятор, переключите его в режим шестнадцатеричных чисел и введите ff, а потом переведите в десятичный режим и получите 256. Т.е. два символа md5-хэша могу принимать 256 разных значений и количество папок у вас не может превышать это число.

4. Если у вас пользователь не грузит десятков тысяч файлов, вы не получаете никакого преимущества, так как уже разбили файлы по пользователям и вряд ли они будут грузить тысячи файлов. А вот если вы все файлы пользователей храните в одной папке - смысл есть. Плюс смотрите, допустим вы написали настолько популярную систему, что у вас получился второй Facebook или твиттер и у вас зарегистрировался миллиард пользователей. Каждый загрузил по 100 файлов в среднем. Вас уже не спасет один уровень вложения, вам придется брать вторую цифру и внутри первой папки делать еще разбиение, а потом еще. Ну и понятно, что вы просто не поместите эту груду информации на один сервер. Скорее всего, конечно, у вас будет некое облако, но если вы захотите хранить изображения на отдельных серверах, то разбиение по хэшу позволит разбросать вам их равномерно, а вот user_1, user_2, user_3 уже нет - потребуется отдельный сервис, который будет брать путь к изображению и вычислять где он там реально лежит в кластере. В общем пока у вас сервер один, все это кажется пустой тратой времени, а вот когда у вас пяток серверов только под аватарки пользователей, такая схема становится гораздо полезнее. Впрочем в современных облачных хранилищах все это уже не так актуально, так как там объекты, доступ к которым индексируется, вряд ли вы будете тенанты по MD5 создавать... хотя все может быть, зависит от того, как разрастется ваш сервис.

  Ответить  
 
 автор: ramundo   (13.03.2016 в 13:31)   письмо автору
 
   для: cheops   (10.03.2016 в 19:10)
 

Спасибо вам за подробнейшее объяснение. Даже я понял все на 100%.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования