PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Тема
Forever
Отправлено: 10 Марта, 2016 - 14:57:56
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Окт. 2014  


Помог: 0 раз(а)




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

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

Так вот. Отрывок из одной статьи http://epsiloncool[dot]ru/programmir[dot][dot][dot]lichestva-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_izobraj eniya1.jpg
photos/user_1/ha/sh/hash_izobrajeniya1.jpg
photos/user_1/ha/sh/hash_izobraj eniya1.jpg

Объясните пожалуйста, чем эти два способа отличаются? Как наличие двух подпапок во втором случае дают все эти самые бонусы из статьи?
 
 Top
Мелкий Супермодератор
Отправлено: 10 Марта, 2016 - 15:53:19
Post Id



Активный участник


Покинул форум
Сообщений всего: 11575
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 564 раз(а)




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

Для начала прыгаем от того, что это md5
1) да, равносильно. Нет, не подпапка для каждого файла, а поддиректория для части файлов.
2) чтобы во вложенной директории f7 тоже было не слишком много файлов.
3) а) потому что md5 представлен как 16-ричное число. Для символа в 16-ричной системе счисления позволяют закодировать от 0 до 255 состояний - ровно 256 разных имён директорий.
б) Потому что md5 разработан для статистически равномерного появления хэшей. Взято два уровня иерархии по 256 элементов в каждой. Значит на последнем уровне будет приблизительно одна часть из 256*256 возможных файлов. Может быть больше, может - меньше, но не сильно.
4) в первом случае вы можете упереться в то, что у пользователя будет плюс дофига файлов и ничего с этим не сделать. Но вы уже партицируете файлы по id пользователя. Они уже не в одной куче.
Во втором необязательно деление по id юзера. Можно хранить всех в одной большой куче, порезанной по символам хэша на части. Всё равно читать их из базы.


-----
PostgreSQL DBA
 
 Top
Forever
Отправлено: 13 Марта, 2016 - 12:20:33
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Окт. 2014  


Помог: 0 раз(а)




Огромное спасибо за подробное объяснение, все вопросы сразу отпали. Не могу сказать "спасибо" на форуме, так как новичкам эта возможность недоступна.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Работа с файловой системой и файлами »


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



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB