apiquestion
@apiquestion
Студент

Как хранить очень большое количество файлов? Как сохранять пути в БД?

У меня в проекте будет очень много картинок (аватары пользователей, постеры для фильмов, обложки для альбомов и т.д.).
Вопрос: как лучше сохранять картинки на сервере и как сохранять пути в БД?
Насколько мне известно, в одной папке можно хранить ограниченное количество файлов, иначе могут быть проблемы (вплоть до полной потери данных). Поэтому нужно создавать какое-то дерево папок и по ним разбрасывать файлы.
На данный момент я не придумал ничего лучше, как генерировать при загрузке файла GUID и, например, для 6F9619FF-8B86-D011-B42D-00CF4FC964FF хранить фото в папке 6F/6F96/6F9619FF-8B86-D011-B42D-00CF4FC964FF.jpg. В БД я планирую хранить только GUID, а загружаемый формат для картинок ограничу одним JPG. Сильно ли костыльно?
Какие еще варианты можно придумать?
  • Вопрос задан
  • 850 просмотров
Пригласить эксперта
Ответы на вопрос 8
sim3x
@sim3x
Насколько мне известно, в одной папке можно хранить ограниченное количество файлов, иначе могут быть проблемы (вплоть до полной потери данных)
нет

Как хранить в СУБД - как угодно, можно хранить путь относительно какой-то директории
Ответ написан
petermzg
@petermzg
Самый лучший программист
Вот и зачем GUID?
Достаточно автоинкрементного int + соль (чтобы не скачивали по id).
А хранить можно в сторадже (Google cloud storage, S3, и т.п.), место занимать на вашем сервере не будут, да и бекапы там делают. А у вас только кеширование в пределах 1-10Gb (зависит от задачи)
Ответ написан
Комментировать
Конечно с поддиректориями. Метод генерации пути - любой.
Но я бы посоветовал сделать именами папок дату. Типа 2017/7/1/hash.jpg - и весь этот путь хранить в БД.
Когда у вас что-то сломается или просто захотите понять что вы там храните - вам это очень поможет. Ну и бекапить инкрементально очень удобно.
Ответ написан
Комментировать
Ну если нужно прям очень большое количество файлов хранить, то вот есть список DFS.
Ответ написан
Комментировать
@d-stream
Готовые решения - не подаю, но...
На данный момент я не придумал ничего лучше, как генерировать при загрузке файла GUID и, например, для 6F9619FF-8B86-D011-B42D-00CF4FC964FF хранить фото в папке 6F/6F96/6F9619FF-8B86-D011-B42D-00CF4FC964FF.jpg. В БД я планирую хранить только GUID, а загружаемый формат для картинок ограничу одним JPG. Сильно ли костыльно?

Собственно подход не нов. Та же WSUS хранит контент именно так, правда ей хватает всего одного уровня вложенности.
Ответ написан
Комментировать
dimonchik2013
@dimonchik2013
non progredi est regredi
так и делают, разве что только
6F/96/6F9

иногда можно в одну папку скинуть симлинки на реальные , разложенные по директориям
Ответ написан
Комментировать
saboteur_kiev
@saboteur_kiev
software engineer
"очень много картинок" - это сколько?
десятки тысяч - легко живут в одной папке.

Если обращаться к файлам по прямому пути, задержки в чтении не будет. Задержка в записи - минимальная.
Если файлов больше 100к, то в принципе да, можно идти так, как вы указали - создавать подпапки, но желательно алгоритм генерации файлов подправить таким образом, чтобы самих папок было не слишком много, ибо если у вас будет 100к папок по 1-3 файла в каждой - это неэффективно и неэкономно.
В линукс каждая папка - минимум 3 directory entry.
Ответ написан
Комментировать
Jump
@Jump
Системный администратор со стажем.
Насколько мне известно, в одной папке можно хранить ограниченное количество файлов, иначе могут быть проблемы (вплоть до полной потери данных).
У каждой файловой системы есть ограничения.
Например максимальный объем файла, или длина пути к файлу. Если вы их не превышаете - все нормально.
Если вы сгрузите все файлы в одну папку - ну вероятно вам будет просто неудобно с ними работать и их сортировать. Возможно некоторые файловые системы будут работать медленнее при большом количестве файлов в папке. Я с таким не сталкивался.
Сколько миллионов файлов у вас будет в одной папке?

На данный момент я не придумал ничего лучше, как генерировать при загрузке файла GUID и, например, для 6F9619FF-8B86-D011-B42D-00CF4FC964FF хранить фото в папке 6F/6F96/6F9619FF-8B86-D011-B42D-00CF4FC964FF.jpg
Правильно и грамотно придумали. Собственно так и делают - файл хэшируют, хэш используется как имя файла, по первым символам хэша идет разбивка на папки, если таковая нужна. Хотя это не единственный вариант, в зависимости от ситуации может быть более удобна другая разбивка.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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