Хранение большого количества файлов в папке?

Redjik

Джедай-мастер
Вопрос по *nix системам.
Есть ли какие то проблемы с хранением овер 100к файлов в одной папке?
Как система производит поиск при обращении к конкретному файлу.

Конкретезирую, хочу хранить много изображений в папке, чтобы не заморачиваться...
Бэкап через rsync...
 

флоппик

promotor fidei
Команда форума
Партнер клуба
*nix системы тут не при чем. Тебя должны интересовать файловые системы.
 

С.

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

Redjik

Джедай-мастер
Забавные люди. Чтобы не заморачиваться с разбиванием на подпапки, готовы заморочиться с какой-нибудь специальной длиннопапочной файловой системой.
Ну дак я поэтому и спросил про ограничения - буду тогда по id раскидывать каждую 1000

Кто вообще как делал? нашел только одну статью древнюю на тему.
 

HEm

Сетевой бобер
Надо делить, как флоппик выше сказал ковыряние в папке с большим количеством файлов сказывается на производительности. Достаточно залезть файловым менеджером в каталог с десятком-другим тысяч картинок чтобы прочувствовать реально.

У нас в последнем варианте цмс (на Mojolicious) все загруженные картинки индексируются в отдельной таблице, имя меняется на соответственно для id=1275 на 0001275.jpg (при этом она еще ресайзится и делаются копии разных размеров с разными префиксами, в каждом проекте от 3 до 6-7 вариантов, например 001275-big.jpg) и падает в каталог /collection/75/12/, каталоги создаются по мере необходимости, таким образом, таким образом равномерно распределяется до миллиона файлов, в реальных проектах для обычного интернет-магазина несколько десятков тысяч это уже рекорд. Тут уж очевидно с запасом сделано, задачи всякие могут случиться (вот например сейчас ковыряю базу тойотовских запчастей, там порядка сотни тысяч картинок)
 

Redjik

Джедай-мастер
ну у меня так же - оригинал в одну папку - 3 копии еще по 3м папкам =) чтобы водяной знак менять если что...

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

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

и падает в каталог /collection/75/12/
так и не понял на каждое оригинальное изображение - своя папка?
 

Ragazzo

TDD interested
Redjik
Для жд не существует понятия папка или индексы, он оперирует тем какие данные ему были заданы цилиндр/головка/смещение.
P.S. у тебя простая ls будет больше минуты выполнятся над файлами >10-15к
 

флоппик

promotor fidei
Команда форума
Партнер клуба
у меня вопрос по стандартному поведению... у nginx попросили - он отдал... он же обращается напрямую.
Что есть «напрямую» ? ОС для него все равно файл в MFT или в ее аналоге найти надо.
есть ли в файловой системе, что-то типа индексов, чтобы головка долго не бегала и не искала фрагмент?
В некоторых — есть. Когда я работал в одной файл-шаре, у нас сторейдж был в XFS, в одной папке лежали стопицот тыщ файлов и не тормозили.
 

С.

Продвинутый новичок
Теоретических ограничений нет или они очень далеко. Но практические есть, свазанные хотя бы с тем, что реестр файлов целиком считывается в ОЗУ.

Как делать? Да как угодно! Хотя бы делить по числовым разрядам или по первым буквам.
 

Redjik

Джедай-мастер
Ага ну понял, не буду извращаться - буду по папкам бить, спасибо.
 

Redjik

Джедай-мастер
Redjik
Для жд не существует понятия папка или индексы, он оперирует тем какие данные ему были заданы цилиндр/сторона/смещение.
P.S. у тебя простая ls будет больше минуты выполнятся над файлами >10-15к
Дак я поэтому и спрашиваю, может в Ext индексы есть, или можно как то назначить... я еще в школе понял как ЖД работает, когда меня научили умному слову дефрагментация =)))
 

HEm

Сетевой бобер
так и не понял на каждое оригинальное изображение - своя папка?
нет, индекс по последним двум цифрам и по предпоследним двум цифрам
но вообще получается что до 10000 файлов каждому выпадает своя папка, а вот дальше они уже начнут рассовываться по имеющимся, т.е. например 211275, 11275 и 1275 будут лежать в /75/12/
 

HEm

Сетевой бобер
можно брать не две цифры а одну, тогда размазывание будет повторяться быстрее
физически похоже как если бы ты кусок масла намазывал на кусок хлеба, каждый следующий кусок размазывается поверх предыдущих и равномерно по всей поверхности
при этом все файлы имеют стандартную маску xxxxxx.ext где x - это цифра

если брать по первой букве, скажем, то есть шанс проулыбаться, когда в одной папке будет 120к файлов типа PICT1234.jpg или DSCN1234.jpg (ну и в зависимости от алгоритма действий при совпадении имен, если как в винде делается дописывать индекс в конец типа PICT1234-0.jpg, PICT1234-1.jpg), а в других по три файла

p.s. у меня дежавю, что мы эту тему меньше года назад поднимали?
 

Фанат

oncle terrible
Команда форума
у нас сделана линковка файлов, когда один и тот же файл может использоваться в разных сущностях, скажем, в двух разных новостях.
при этом именование файлов делается, как md5 от содержимого. так количество уникальных файлов сокращается ещё сильнее.
ну и как бонус - у мд5 распределение буков вполне случайное, так что последняя описанная проблема не имеет места быть
 

Redjik

Джедай-мастер
Ну я сейчас сделал 1000 картинок на папку (по id) в базе название md5 + base_convert($str,16,36).расширение,title,alt, название модели, id сущности которая имеет изображение
 

HEm

Сетевой бобер
именование файлов делается, какmd5 от содержимого
да, часто так и делается, я думаю, бОльшим плюсом тут является непредсказуемость названия, значительно усложняется возможность скачивания контента
у нас в старой версии цмс когда загружается файл с существуюшим названием то ему генерится случайным образом другое имя, по идее смысла в хранении оригинального названия файла в большинстве случаев нет, если так уж нужно - можно отвести отдельное поле в БД
 

Фанат

oncle terrible
Команда форума
Redjik, во, у меня тоже base_convert для краткости
только имей в виду, что она на системах с разной разрядностью даёт разный результат.
В приципе, сейчас везде 64 бита, так что проблем быть не должно, но на всякий случай.
 
Сверху