LINUX.ORG.RU

Структура хранения файлов на сервере


0

1

Добрый день Лоровцы.

Посоветуйте как хранить данные на сервере. К примеру имеем множество файлов книг, картинок или музыки. Каждый файл соответствует записи в бд. но сваливать всё в 1 каталог на сервере нельзя. к примеру reiserfs ограничивает в одном каталоге до 65000 файлов/каталогов. У кого есть опыт в этом деле, помогите советом.

★★

Последнее исправление: ex3me (всего исправлений: 1)

Достаточно одного PHP файла который берёт инфу из базы данных.

psp13
()
Ответ на: комментарий от Kalashnikov

Понял что имеется ввиду. Можно разложить по каталогам ID / 10,000 например.

psp13
()

А что у тебя только категории книги, картинки музыка? Дроби дальше жанр, фамилия автора: книги->науч.фантастика->А, книги->науч.фантастика->Б...

mopsene ★★★
()

по id сортируй или md5 от чего-нибудь бери, например, от английского имени файла.

xpahos ★★★★★
()

Недавно, в этой ветка кажется, на ЛОРе был срач поэтому поводу, поищи.

VirRaa ★★★
()

к примеру reiserfs ограничивает в одном каталоге до 65000 файлов/каталогов

Твои сведения ложны, нет в reiserfs такого ограничения. Не всё, что в интернете пишут — правда.

$ time for i in `seq 0 10000 1000000`; do touch `seq --format="file_%06.0f" $i $((i+9999))`; echo $i; done;

real	0m40.556s
user	0m6.344s
sys	0m27.854s

$ time ls -1 | wc -l
1010000

real	0m5.570s
user	0m5.064s
sys	0m0.508s

Как видишь, в одной директории в reiserfs без проблем можно создать более миллиона файлов. В ext4 тоже нет как такового ограничения на число файлов в директории, есть общее ограничение на число inode. На мелком /tmp за пару секунд образовалось более 100 тыс. файлов, дальше иноды кончились.

i-rinat ★★★★★
()

Можно ещё хранить в файлах с названиями в виде хешей. А первые цифры использовать как названия каталогов. Например, книга с полным названием «filename» будет лежать в файле 43/5e/d7e9f07f740abf511a62c00eef6e, где 435ed7e9f07f740abf511a62c00eef6e==md5(«filename»).

i-rinat ★★★★★
()
Ответ на: комментарий от xorik

Это у ext3 было 65к файлов

Неа, только что проверил, создал ext3, смонтировал и создал миллион файлов прямо в корне. В ext3 ограничение не на файлы, а на количество жёстких ссылок на файлы (32000 ровно), и, как следствие, на число поддиректорий. Максимум 31998 штук. У ext4 такого ограничения нет.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Ограничение в reiserfs меня лично коснулось. Я сначала сам увидел ограничение, а потом уже прочитал что не я один такой. возможно у вас используется патч.

Кстати, файловая система ufs для который это нужно. Reiser я привел к примеру.

Решение которое я буду использовать такое:

файл привязан к записи, а запись имеет уникальный id (на примере 123).

id -> md5 -> из шестнадцатеричной(0-9a-f) в 26ричную(+заменяем цифры на недостащющие буквы, получается английский алфавит a-z) из алфавита я беру первые 3 символа, к примеру btq и еще следующие 3 символа ayh. мой файл будет лежать в каталоге /data/btq/ayh/123.jpg

ex3me ★★
() автор топика
Ответ на: комментарий от ex3me

из шестнадцатеричной(0-9a-f) в 26ричную(+заменяем цифры на недостащющие буквы, получается английский алфавит a-z)

Эффективнее будет base64:

$ echo -n "your long-long file name" | md5sum | xxd -r -p | base64
FMGbvu3ZCeu6BNSzhgerfQ==

Готовые отлаженные и оптимизированные алгоритмы. И не надо делать преобразования из байт (md5) в строку, потом её в число и т.п.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

О спасибо. Ценная инфа

P.S. преобразование md5 делаю из id а не из файла... если вы об этом говорили

ex3me ★★
() автор топика
Ответ на: комментарий от ex3me

преобразование md5 делаю из id а не из файла... если вы об этом говорили

md5 выдаёт 128-битное число (1), которые для читаемости преобразуют в строку (2), которую ты будешь преобразовывать в число (3), которое затем будет преобразовано в другую строку (4). Вот второй и третий этап — лишние.

i-rinat ★★★★★
()
Ответ на: комментарий от ex3me

У вас id не числовые что ли ? Ссылку каждый раз генерите на файл ? Показываем на странице 100 ссылок - 100 раз md5 от id вызываем ?

Выше же был пример:
/path/to/storage/intval(ID/10000)/ID/filename.here

funduk
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.