|
|
|
| Доброе утро. Всех с Днём Победы!
Подскажите, как лучше всего организовать хранение данных на сайте?
Для примера возьмём фотоальбомы. Очень подходит. Имеются фотоальбомы. В каждом загружаются фотографии. Фотоальбомы могут ссылаться друг на друга (то есть имеется возможность вкладывать один в другой). Если создавать папку в /photos/ для каждого фотоальбома по ID (например, /photos/5/), то все фотографии будут загружены в эту папку. Если фотографий будет 100 000, а для каждой создаётся в папке по четыре файла (preview), то всего получим в папке уже целых 400 000 файлов. То есть при удалении фотоальбома нужно будет удалить 400 000 файлов, и только потом папку. Это может слишком нагрузить сервер. Не так ли? Как поступить, кто сталкивался, у кого есть идеи? Спасибо. | |
|
|
|
|
|
|
|
для: Udachix
(09.05.2013 в 09:38)
| | У вас и директория с таким объемом файлов будет читаться не быстро. Обычно каждой фотографии назначается хэш, а на диске заводятся директории с таким хэшем, в результате фотографии хранятся ни в одной директории, а в сотнях.
При удалении такого объема не удаляйте фотографии, а помечайте как удаленные, которые удаляйте постепенно в фоновом режиме, например, по cron-заданию. | |
|
|
|
|
|
|
|
для: cheops
(09.05.2013 в 09:48)
| | Да да, кстати, о cron'е я уже думал и как раз хотел просто переименовывать папки, прибавляя "deleted_" или что-то вроде того. Однако, остаётся вопрос, какие папки мне переименовывать? То есть как всё же хранить эти файлы?
P. S. Каждое фото прописано в DB, поэтому мне не нужно читать директорию саму. Я просто знаю, что файл там есть. | |
|
|
|
|
|
|
|
для: Udachix
(10.05.2013 в 01:56)
| | >прибавляя "deleted_" или что-то вроде того.
Лучше правами доступа манипулируйте, например убирайте read. Те файлы, у которых отсутствует права доступа read, скажем на группу или для всех остальных - подлежат уничтожению.
>Однако, остаётся вопрос, какие папки мне переименовывать? То есть как всё же хранить эти файлы?
Папки вообще лучше не трогать. Обычно вычисляют crc32-хэш имени файла (нужно обеспечить их уникальность) и берут первые 2-3 символа от хэша - это и есть имя папки, файлы у вас равномерно распределяются по 100-1000 папкам. В результате в каждую папку в отдельности легко получить доступ, а по имени файла легко вычислить название папки, где его следует искать. | |
|
|
|
|
|
|
|
для: cheops
(10.05.2013 в 09:40)
| | Кажется, идею понял. Но всё равно есть вопрос.
Имена файлов сейчас у меня следующие (примеры):
photo5_iCuZD08fUm1QAM.jpg
photo25_fbuowau6oNOwG3.jpg
photo100_gEVZqHqUqFvL6u.jpg
photo250_wyAAEBdFmAwCef.jpg
photo500_UQtVBQLStv6aB3.jpg
photo711_vyjrhUDXCOmGzu.jpg
photo10700_5nv3RLXCI0SdMj.jpg
| Как это мне поможет в распределении "по 100-1000 папкам"? | |
|
|
|
|
|
|
|
для: cheops
(09.05.2013 в 09:48)
| | Была ещё идея такая:
/photos/100000/5/photo.jpg
/photos/200000/100005/photo.jpg
/photos/300000/200005/photo.jpg
/photos/400000/300005/photo.jpg
| , то есть разделять по сотням тысяч ID.
Осталось только в PHP найти функцию, способную округлить число до 100 000 ) Например, 1 125 350 до 1 200 000. | |
|
|
|
|
|
|
|
для: Udachix
(10.05.2013 в 02:00)
| | Лучше используйте хэши - они экономичнее и более масштабируемы. Более того, они специально для таких задач созданы. | |
|
|
|
|
|
|
|
для: cheops
(10.05.2013 в 09:42)
| | Всё, разобрался и реализовал, почти.
Теперь изображения сохраняются как:
photos\ed\23\91\e4\ed2391e4d104259fd8a46793c91e7f27.jpg
|
Одно но, теперь удалять сложнее. Вдруг, будет существовать два изображения с адресами:
photos\ed\23\91\e4\ed2391e4d104259fd8a46793c91e7f27.jpg
photos\ed\23\91\4e\ed23914ed104259fd8a46793c91e7f27.jpg
| Удаляя первое под корень папки, я удалю второе, а если удалять только сами файлы — директории останутся пустыми, тоже как-то не то... | |
|
|
|
|
|
|
|
для: Udachix
(10.05.2013 в 17:36)
| | если удалять только сами файлы — директории останутся пустыми
Во многих ЦМС именно так и происходит. При этом образуются десятки и даже сотни тысяч пустых директорий.
Более того,
Даже если заносится товар, не имеющий изображения, директория создается и для этого товара (заведомо пустая). | |
|
|
|
|
|
|
|
для: Владимир55
(10.05.2013 в 17:52)
| | Вы так сказали, будто это болезнь системы и её не вылечить )
Cron по пустым запускать? | |
|
|
|
|
|
|
|
для: Udachix
(10.05.2013 в 18:10)
| | Да пусть остаются - на самом деле это даже хорошо, потом не нужно тратить время на их создание. Главное, чтобы в одной директории было не много файлов и других директорий - тогда поиск по такой иерархии будет осуществляться быстро. | |
|
|
|
|
|
|
|
для: cheops
(10.05.2013 в 18:30)
| | Сделал четыре уровня, в конце каждого по три варианта одного файла. Надеюсь, не много будет. | |
|
|
|
|
|
|
|
для: Udachix
(10.05.2013 в 18:10)
| | Не то, что бы болезнь, а такова реальность, и разработчики идут на это.
Реальное неудобство возникает лишь в том случае, когда хостер ограничивает количество файлов на хостинге (обычно 130 тысяч), поскольку пустые директории считаются как и файлы.
Кстати, даже чере ФТП удаляются они жутко долго. | |
|
|
|
|
|
|
|
для: Владимир55
(10.05.2013 в 19:08)
| | Через FTP вообще все делается очень долго (так как на каждую операцию нужно дождаться ответа), такие структуры лучше всего удалять через SSH при помощи команды rm -rf (только от путь от греха лучше задавать абсолютный). | |
|
|
|
|
|
|
|
для: cheops
(10.05.2013 в 19:10)
| | Я тут на днях буквально испугался сильно очень. Написал функцию по циклическому удалению директорий через rmdir. Чуть не охренел, простите, что путь указал "/". Оказалось всё хорошо, путь был "./", так что он ничего не удалил ) | |
|
|
|
|
|
|
|
для: cheops
(10.05.2013 в 19:10)
| | Я вот тут припомнил такой факт: когда-то я делал сайт с очень большим количеством статических страниц и разместил их в директориях по 15 тысяч страниц в каждой. Субьективно замедления открытия страниц не было заметно (по отношению к тем, что в корне). | |
|
|
|
|
|
|
|
для: Владимир55
(11.05.2013 в 10:50)
| | Замедление можно заменить, как правило, только при первом открытии директории или если на сервере мало свободной памяти и содержимое директории не кэшируется. Кроме этого замедление может быть при обслуживании такой директории по FTP, когда после каждой операции получается список содержимого текущей директории (он может быть не маленьким). | |
|
|
|
|
|
|
|
для: Udachix
(09.05.2013 в 09:38)
| | Всем спасибо. Ваши примеры, мнения и взгляды очень помогли. Я реализовал, что хотел. Всё получилось. | |
|
|
|