Как правильно хранить много файлов?

smitt

Новичок
Как правильно хранить много файлов?

Подскажите пожалуйста, есть необходимость хранить много файлов на диске. Каждый файл - картинка, которая будет доступна через веб.
Как это лучше сделать?

Пока остановился на таком варианте - у каждого файла есть ID, поэтому я могу вычислить из него md5, разбить хэш на части и хранить каждый файл в отдельной папке, типа

md5(42) == a1d0c6e83f027327d8461063f4ac58a6

файл хранится в директории someserver.com/images/a1d0/c6e8/3f02/7327/d846/1063/f4ac/58a6/42.jpg

Так файлы не будут скапливаться в больших количествах в одной директории.

Какие вы видите недостатки у данного метода, какие методы хранения можете предложить?
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Я этом варианте у тебя будет много директорий в которых хранится 1-н файл.
я храню тупо
/YYYY/MM/DD/filename

-~{}~ 22.09.10 19:40:

Если файлов в день ну нереально много, то "разбей" на
/YYYY/MM/DD/[1000-2000/]/filename
/YYYY/MM/DD/[2000-3000/]/filename
типа того.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
smitt
Много это сколько?
Думаю, что тебе вполне хватит и ситуации с md5(id), где ты возьмешь первый и второй символы хеша.

.../a/b/filename.jpg
 

smitt

Новичок
Автор оригинала: Mr_Max
Я этом варианте у тебя будет много директорий в которых хранится 1-н файл.
я храню тупо
/YYYY/MM/DD/filename

-~{}~ 22.09.10 19:40:

Если файлов в день ну нереально много, то "разбей" на
/files/[1000-2000/]/filename
/files/[2000-3000/]/filename
типа того.
Файлы вообще никак не привязаны к датам...
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Файлы вообще никак не привязаны к датам...
smitt
и что из того?
Есть глубокая разница?
ты файлы загружаешь, вот ставь текущую

-~{}~ 22.09.10 19:45:

Если тебе конкретно не нравится, что в урле будет дата, ну так сделай трансляцию в набор нужных тебе символов.
 

smitt

Новичок
Автор оригинала: Mr_Max
smitt
и что из того?
Есть глубокая разница?
ты файлы загружаешь, вот ставь текущую

-~{}~ 22.09.10 19:45:

Если тебе конкретно не нравится, что в урле будет дата, ну так сделай трансляцию в набор нужных тебе символов.
Ну вот возьму я сегодня сгенерирую три миллиона файлов, а завтра ещё пять. Какие мне им даты ставить?

К тому же хотелось бы иметь возможность получить путь к файлу зная только его ID.

-~{}~ 22.09.10 21:32:

Автор оригинала: c0dex
smitt
Много это сколько?
Думаю, что тебе вполне хватит и ситуации с md5(id), где ты возьмешь первый и второй символы хеша.

.../a/b/filename.jpg
В идеале - не хотелось бы на верхний предел вообще рассчитывать :) Допустим десять миллионов.

-~{}~ 22.09.10 21:38:

Два символа - это 16 раз по 16 директорий, получается 256 папок.
При условии равного распределения это получается почти по 4 тысячи файлов в директории уже при миллионе файлов, тоесть маловато.

Вообще интересовала критика подхода в целом, если такой способ вообще приемлем, т.е. нет подводных камней, которых я не понял - то он сойдёт. Ну могу укоротить путь до 4 папок вместо 8, этого в принципе должно быть достаточно...
 

Фанат

oncle terrible
Команда форума
Вообще интересовала критика подхода в целом, если такой способ вообще приемлем,
то есть ты ни разу не видел ссылку на картинку, лещащую на каком-нибудь файлхостинге типа ljplus?
 

smitt

Новичок
Конкретно на LJPlus не видел, т.к. я не уверен что вообще этот сайт видел, но в целом - конечно видел.

Но если я что-то видел - не факт что это правильно, т.к. я много разного видел.

Тем более я не знаю, какие у них там файловые системы используются, какие оптимизации сделаны...

Поэтому и спрашиваю совета.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
если я правильно понимаю, на каждый http-запрос будет запрос к файловой системе на каждый уровень папок, т.е. по 10 лишних запросов в твоем случае

>Два символа - это 16 раз по 16 директорий, получается 256 папок.
Два символа - это 36 раз по 36 папок = 1296
а можно 3 символа, это 46656 папок, по 2 тысячи на 100 миллионов
или ты из гугла?

md5() возвращает бинарник, его (или первые 128 бит) можно перевести в base36, и заюзать первые 3 буквы
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
потому что в латинском алфавите 26 букв + 10 цифр
 

smitt

Новичок
А, в этом смысле.
Ну я отвечал c0dex'у, который говорил об md5.

> md5() возвращает бинарник, его (или первые 128 бит)
> можно перевести в base36, и заюзать первые 3 буквы

Спасибо за совет, попробую.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
или кроме 16-ричной системы счисления ничего больше знать не хотим, и о том, что в алфавите не 6 букв, а 26 - мыслей нет?

-~{}~ 22.09.10 22:59:

>Спасибо за совет, попробую.

всегда пожалуйста
 

smitt

Новичок
Получается что-то вроде

PHP:
$path = base_convert(md5(42),16, 36);
$path = '/'.chunk_split(substr($path, 0, 3), 1, '/');
Код:
/9/k/v/
 

Духовность™

Продвинутый новичок
Храню всегда файлы как

/1000/12/файл_нейм.jpg
/2000/1001/файл_нейм.jpg
/3000/2999/файл_нейм.jpg
и т.д.

Первая цифра - 1000 - это диапазон. 12 - ID сущности, к которой привязываются изображения (изображения к статьи, например).

12 входит в диапазон 0-1000
1001 входит в диапазон 1000-2000
2999 входит в диапазон 2000-3000
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
"Warning base_convert() may lose precision on large numbers"
PHP:
$i = md5(42);
$x = base_convert($i,16,36);
$y = base_convert($x,36,16);
echo $i,' ',$y;
a1d0c6e83f027327d8461063f4ac58a6
a1d0c6e83f0270000000000000000000

хотя, наверное, это неважно тут - начало совпадает, т.е. можно ожидать одинаковые первые символы на разных системах
 

smitt

Новичок
Автор оригинала: triumvirat
Храню всегда файлы как

/1000/12/файл_нейм.jpg
/2000/1001/файл_нейм.jpg
/3000/2999/файл_нейм.jpg
и т.д.

Первая цифра - 1000 - это диапазон. 12 - ID сущности, к которой привязываются изображения (изображения к статьи, например).

12 входит в диапазон 0-1000
1001 входит в диапазон 1000-2000
2999 входит в диапазон 2000-3000
Тоесть, когда у тебя будет миллион файлов - в корне будет тысяча папок?
 

Духовность™

Продвинутый новичок
Тоесть, когда у тебя будет миллион файлов - в корне будет тысяча папок?
ты так спросил, с таким упреком, как будто я каждый день разрабатываю системы с миллионами изображений.

Когда у меня будет миллион сущностей, а не миллион файлов. Сущность - это то, к чему привязываются файлы - статья, альбом, новость. Сущность имеет свой ID. Файлы лежат в директории под именем ID сущности - 12, 1001, 2999. В каждой такой директории может быть сколь угодно файлов.
И это.. тысяча папок - это совсем не много.


Всё зависит от задачи. Мой алгоритм расположения изображений очень нагляден тем, что мы знаем, где лежит файл, закрепленный за определенной сущностью.
Все эти ваши пути в стиле /d0/c6e8/3f02/7327/d846/ это какой-то АдЪ и погибель. Может для хостинга картинок и годится, но среднечковый проект делать с таким расположением файлов.. не знаю, не знаю. Мне нравится когда все человекопонятно.
 

iceman

говнокодер
> если я правильно понимаю, на каждый http-запрос будет запрос к файловой системе на каждый уровень папок, т.е. по 10 лишних запросов в твоем случае


это хуже чем искать в одной папке в которой хранится миллионы файлов?

smitt
зачем тебе знать путь к файлу? или ты не для ВЕБ это используешь?
 
Сверху