Как лучше хранить большое кол-во мелких файлов?

Spear

почемучка
Как лучше хранить большое кол-во мелких файлов?

Здравствуйте,
у меня такой вопрос -
есть около 400 категорий (назовем их так), и для каждой из них есть файлы (картинки).

И я вот все никак не решу как мне их хранить.
Есть такие варианты:

/files/images/номер категории/картинки.jpg

Но в таком виде - будет очень много категорий (400).
Есть ещё такой вариант:
/files/images/кртинка_номер_категории.jpg

Тогда во втором варианте при if(file_exists($image_name."_".$catID)) не будет ли тормозить скрипт, проверяя наличие в папки такого-то файла, когда там всего окоо 3 тысяц файлов? В среднем по 100 кб каждый..
как посоветуете?
 

Groove

Новичок
Re: Как лучше хранить большое кол-во мелких файлов?

Автор оригинала: Spear
Тогда во втором варианте при if(file_exists($image_name."_".$catID)) не будет ли тормозить скрипт, проверяя наличие в папки такого-то файла, когда там всего окоо 3 тысяц файлов? В среднем по 100 кб каждый..
как посоветуете?
в свое время решил такую проблему примерно так:
PHP:
    /**
    * @return string
    * @desc Вычислить путь к директории зная числовой идентификатор
    .
    к примеру на выходе:   0/1/
    */
    function calcPathById($id=0){
      $dir1 = substr($id,strlen($id)-1,1);
      $dir2 = substr($id,strlen($id)-2,1);
      return $dir1.'/'.$dir2.'/';
    }
затем создаешь например в папке /images/
директории от 0 до 9 и в каждой из них еще директории от 0 до 9, итого имеешь
/images/
/images/0/
/images/0/1/
/images/0/2/
...
/images/9/8/
/images/9/9/

в таком случае создается наиболее равномерное распределение фалов по директориям.

теперь далее: для разным модулей генерируешь имя картинки на основе идентификатора и имени модуля. К примеру:
для картинки новости с №123 генерим имя файла:

PHP:
$id = 123;
$path = '/images/'.calcPathById($id);
$filename = $path.'news_'.$id.'.jpeg';
при проверке наличия файла выполняешь то же самое
а также при загрузке генеришь куда записать его
 

Spear

почемучка
это галерея - там может быть для одной категории несколько десятков изображений :)
Так что генерить по айди категории - не получится вроде.
А по вопросу - как же всетаки лечше хранить?
 

phprus

Moderator
Команда форума
Spear
Тогда можно присваивать каждой картинке свой уникальный идентификатор и уже используя его использовать метод Groove. Но тогда тебе придется еще хранить таблицу связей категория => картинка.
 

Spear

почемучка
то есть как я понял - хранить картинки в 400 папках не стоит? Это напряжно для сервера?
 

si

Administrator
Spear
зависит от ОС и используемо файловой системы. все современные fs переживут 400 файлов не напрягаясь
 

Spear

почемучка
si
а если 10к папок и в каждой по 5-6 файлов? это не просто вопрос "лишь бы спросить". Нужно знать, потому как может и такое случиться.
Сервер Юниксовский. Больше ничего не скажу так как я по этим вопросам не спец.
 

Steamroller

Новичок
а если 10к папок и в каждой по 5-6 файлов? это не просто вопрос "лишь бы спросить". Нужно знать, потому как может и такое случиться.
Сервер Юниксовский. Больше ничего не скажу так как я по этим вопросам не спец.
Это надо уточнить у админа этого сервера. Некоторые ФС это вообще не заметят (напр. reiser на линуксе, или UFS2 на современных FreeBSD с поддержкой directory hashing).
 
Сверху