Архитектура хранения картинок

Есть несколько сотен тысяч картинок (все приличные:)))), под номерами от 1 до… Чтобы их удобней было обрабатывать я создал структуру папок, и файлы хранятся так:

файл 1131.jpg хратится в images/000000/00000/1000/1131.jpg
файл 2131.jpg хратится в images/000000/00000/2000/2131.jpg
файл 258131.jpg хратится в images/200000/50000/8000/258131.jpg
и т.д.

тем самым у меня в папке хранится по 1000 картинок. При этом, при синхронизации я не имею проблем по FTP их закачивать на сервер (часть серверов выводят только первые 2000 файлов из директории). Но вот чтобы писать и читать файлы из таких директорий сложно, надо сделать 3 деления, чтобы понять к какому разряду относится эта картинка.

А как вы храните большие объёмы файлов? И так чтобы удобно с ними по FTP работать?
  • Вопрос задан
  • 2770 просмотров
Пригласить эксперта
Ответы на вопрос 7
Wott
@Wott
ftp очень неудобный протокол вообще. Для каких-то операций я качаю архив, а потом `sudo cp -ruv `
И еще — мне кажется что id для картинки лишняя вещь — обычно я храню по имени файла по схеме 1:2 ( /n/am/name.jpg )
Ответ написан
Atrax
@Atrax
Есть очень простой механизм.
У файла есть ID и имя, не так ли?

Разбиваете число по «разрядам» в произвольной системе счисления и записываете в обратном порядке получившиеся цифры.
Например 12 превращается в путь 2/1/file.ext, а 12345 в 5/4/3/2/1/file.ext
Файловая система становится сбалансированным деревом.

Это самый простой случай, если вместо основания 10 использовать 256, то получаете:
15 — e/file.ext
256 — 1/1/file/ext
Пути — e5/c3/12/file.ext будут короче из-за более редкого использования слеша.

Основание системы счисления может быть любым, кодировка тоже (например base64 с большими и малыми буквами).
Выбирать оптимум вам.
И никакой денормализации — храните ID и имя, путь восстанавливается из ID функцией в несколько строк.
Ответ написан
casey
@casey
А почему бы вам не хранить путь к картинке там же, где вы храните имя файла? С одной стороны — денормализация конечно, с другой — вполне компромисс.
Ответ написан
casey
@casey
Требования взаимоисключающие :-) Когда большой объем + отказоустойчивость — это gridfs, hadoop, mofilefs. Ftp тут не очень вяжется :-)

По вашей задаче — напишите bash скриптик или обертки для функций на языке вашего проекта, чтобы операции с такими файлами были «прозрачными».
Ответ написан
Вместо деления использовать substr или что-то этом роде не быстрее будет?
Ответ написан
Inecs
@Inecs
Вот еще можно почитать https://sites.google.com/site/kamaikin/rabota-s-fajlami-1/teoria-hranenia-fajlov-na-servere
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы