Алгоритм раскидывания фотографий по папкам

Сенсей

Новичок
Алгоритм раскидывания фотографий по папкам

Когда то тут была тема что фотографии (файлы) когда их много лучше раскидывать по папкам.. будет быстрее и т.д.

В эту тему заходить не будем.. скажу одно - сейчас у меня на сервере в папке photos - 29761 файлов... вот понадобилось скачать их на локалку - так FlashFXP даже папку не открывает...

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

Значицца так.
Есть пользователи - каждый может загружать по 10 фотографий.
Проэкт расчитан на минимум 20k пользователей + на долгосрочное существование. То есть минимум 3-4 года.

Есть пару соображений. Например сохранять в папки "год/месяц/день закачки фотографии" но тогда слишком много папок будет...

Если загружать в "год/месяц/" или просто "год" - то представьте что прошел год. Пользователи теже. Вот поставили они в новом году новые фотографи (а это они делают как минимум раз в неделю). Получится что в прошлогодней папке нет фотографий... а в папке текущего года - есть.. в том же количестве.. получится что я просто меняю название папки...

Пока что остановился на хранение фотографий в 12 папках типа "месяц" (общие папки без разделения на года)

Но все это связано с датой закачки фотографии.

Есть еще идея хранить фотографии с привязкой папка=месяц регистрации пользователя на сайте. То есть те же 12 папок, но фотография будет заноситься в папку которая соответствует месяцу в который юзер зарегался на сайте. Но число регистрирующихся юзеров на сайте будет расти с каждым днем. Поэтому уже сейчас можно сказать что в папке "январь" будет намного меньше фотографи чем через 6 месяцев в папке "Июль"

Вобщем, помогите. В голове каша. Хочецца сделать цивильно, что бы потом проблем не было.
 

zerkms

TDD infected
Команда форума
храни пачками допустим по 1000 штук
соответственно в каталоге 1: файлы с 0 по 999 и тд
 

kamatoz

Новичок
я делаю обычно так:
имя файла генерится md5(uniqid()); (обычно обрезаю до 10 символов, 2^40 вариантов для меня достаточно с избытком)
создается 16 директорий, в качестве названий цифры в hex. Название директории - первая цифра в имени файла. В директориях - опять-же директории с теми-же названиями, только уже вторая цифра имени файла. Вложенность, в зависимости от количества файлов, можно увеличить. Если непонятно объяснил, для примера:
a/b/ab12f7c84e.jpg

информация о файлах (имя, дата и т.д.) хранится в базе. Для того, чтобы узнать путь до файла в ФС достаточно иметь лишь имя файла...
Надеюсь, понятно ;).
 

zerkms

TDD infected
Команда форума
kamatoz
а чем вас id в качестве имени не угодило?
 

HEm

Сетевой бобер
у пользователей обязательные логины, так что можно генерять фотки в формате login[id] и рассовывать в папки a, b, c ... y, z, 0, 1, 2 ..., 9
 

kamatoz

Новичок
zerkms
может туплю, но разве при варианте с id не придется использовать условия и математические действия?
 

kruglov

Новичок
kamatoz
Такое сложное математическое действие остаток от деления % ?
 

Groove

Новичок
Re: Алгоритм раскидывания фотографий по папкам

или вообще примитив:
1) есть функция
PHP:
    function calcPathById($id=0){
      $dir1 = substr($id,-1);
      $dir2 = substr($id,-2,1);
      return $dir1.'/'.$dir2.'/';
    }
2) есть директории:
Код:
/images/
/images/0/
/images/0/0/
...
/images/0/9/
...
/images/9/
/images/9/0/
...
/images/9/9/
3) при аплоаде пишешь информацию о картинке в БД (например описание, ширину, высоту, размер в байтах, расширение или имя файла, ну или еще что)

4) получаешь
PHP:
$id = mysql_insert_id
и передаешь его в функцию
PHP:
$path = calcPathById($id);
на выходе например: 0/1/

5) сохраняешь картинку в ФС
PHP:
$img_file = sprintf("%s%s%s"
 "/home/sitename.com/www/images/",
  calcPathById($id)  ,
  $id.'.jpeg'
);
6) при необходимости получить путь к картинке с идентификатором $id ессно делаешь наоборот:
PHP:
$img_url = sprintf("%s%s%s"
 "/images/",
  calcPathById($id)  ,
  $id.'.jpeg'
);
 

zerkms

TDD infected
Команда форума
kamatoz
т.е. в твоём случае обработка имени файла не придётся да? или первые буквы ниоткуда у тебя появляются? ;)

-~{}~ 07.12.06 16:45:

Groove
$dir1 = substr($id,strlen($id)-1,1);
вместо этого изврата открой для себя $dir{$id}
 

kamatoz

Новичок
zerkms
из обработки только $filename{0}.'/'.$filename ;)
kruglov
точно только остаток? ;) расскажи, как зная что id файла 37564 получить до него полный путь, используя только % ? ;)
 

Groove

Новичок
Автор оригинала: zerkms
Groove
вместо этого изврата открой для себя $dir{$id}
мне надо построить именно так:
сперва взять последнюю цифру, а потом если есть предпоследнюю

как это сделать твоим методом?
 

HEm

Сетевой бобер
kamatoz
ты не можешь вытащить из цифры 37564 цифры 4 и 6?
по методу грува такой файл должен лежать в папке images/4/6/
 

zerkms

TDD infected
Команда форума
Groove
уже сказали - %
а по поводу {} - пардон, спутал, показалось ты так получаешь именно первые знаки ;)
 

kamatoz

Новичок
kruglov
>>храни пачками допустим по 1000 штук
>>соответственно в каталоге 1: файлы с 0 по 999 и тд

вот к чему приводит непонимание. Ага. Чего=то у меня из 37564 никак не получается 38 твоим способом ). На разные сообщения отвечали.
 

MiksIr

miksir@home:~$
/{первая буква логина пользователя}/{вторая буква логина пользователя}/{третья буква логина пользователя}/{логин пользователя}/его фотки
И вообще, принцип такой сортировки зависит от того, как будут использоваться эти фотки.. т.е. от дизайна програмного решения.
 

Сенсей

Новичок
Автор оригинала: MiksIr
/{первая буква логина пользователя}/{вторая буква логина пользователя}/{третья буква логина пользователя}/{логин пользователя}/его фотки
Как тебе такие логины?

^DaShA^
~!RuSSiAn_GiRL!~
~$A_MAN_APART$~
~*stasya*~
~+Ani4ka+~
~:len4ik:~
~kukla marinka~
~Reginka~
† † †SiD † † †
-------------------

+ Если у меня 50k юзеров ты предлагаешь создавать 50K папок для хранения в каждой по 10 фоток? Изврат.

Понравилось предложение от Groove
Ка мне кажется, если исходить что у каждого юзера будет по 10 фотографий (читай - одинаковое количество) - то следуя логике.. в каждой папке будет примерно одинаковое количество фотографий.. вне зависимости от количества пользователей, от того сколько их регистрируется ежедневно и в каком дне/месяце/году были загружены фотографии...
 

HEm

Сетевой бобер
Сенсей
ты думаешь, если запретишь вводить символы, которые нельзя использовать в названиях папок/файлов, то посещаемость упадет в разы? ;)
 

hermit_refined

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

а вот логины... by default, я такие уродства запрещаю.
 

MiksIr

miksir@home:~$
Еще раз - принцип такой сортировки зависит от дизайна програмного решения. Правильного для всех случаев варианта - нет. Равно как и ничего страшного в 50к папок. И равномерное распределение - это опять же by design, - это требование вроде нигде не указано. Скорее указано удобство управления. А per-login структура очень прозрачна для нескриптовых манипуляций.
В общем, решений куча - не понимаю, что такой ажиотаж тема вызвала.
 
Сверху