Какие можно использовать технологии/форматы для хранения бинарных пользовательских данных в десктопном приложении?

Десктопное приложение с функциями Second Brain / Personal Project Management / Personal Knowledge Management / Document Management System / Media-Photo Library Management / Virtual Board.
Хочется хранить весь профиль пользователя (то, что обычно называют Vaults или Spaces в похожих приложениях) включая бинарные файлы (библиотеки изображений, мультимедиа, документов и т.п. файлов) в едином файле с быстрым доступом, вместо иерархии папок на файловой системе.
Какие есть варианты? Архив без сжатия, динамический виртуальный диск vhdx (наверное, самый близкий к желаемому функционалу вариант)? Объектные хранилища по типу MinIO? Не очень бы, конечно, хотелось для полностью десктопного приложения использовать работающие по архитектуре сервер-клиент технологии, может есть некие автономные объектные хранилища?
  • Вопрос задан
  • 362 просмотра
Решения вопроса 1
2ord
@2ord
Хочется хранить весь профиль пользователя (то, что обычно называют Vaults или Spaces в похожих приложениях) включая бинарные файлы (библиотеки изображений, мультимедиа, документов и т.п. файлов) в едином файле с быстрым доступом, вместо иерархии папок на файловой системе.

Хранить в архивах ZIP, TAR/PAX, конечно, можно, но не сильно удобно: вместо работы с файлами придётся работать с библиотеками для работы с архивами: то записать в архив, то прочесть с него. С точки зрения производительности вряд ли будет столь же эффективно, как с файловой системой (даже с иерархией папок).

Можно просто держать пользовательские настройки и файлы - отдельно. И ничего особо мудрить тогда не нужно и будет очень универсально. Хотя, с точки зрения кросс-платформенности, скорее всего, будет не так всё хорошо. Но если пользоваться библиотеками поддерживающими кросс-платформенность - так лучше, конечно.

В настольных приложениях общие настройки и данные хранят в /etc , /usr/share , /usr/lib (Linux) , пользовательские - согласно спецификациям XDG и в Windows - в своих директориях.

Медиа-файлы, конечно, должны быть доступны приложению простым образом, без необходимости писать/читать в/из архив(а). Особенно, если необходимо запустить ассоциированное с типом файла внешнее приложение, как видео-проигрыватель.

Более гибкий вариант: использовать SQLite или какую-то K/V СУБД (тот же Redis!). В добавок к кросс-платформенности получаем возможность простым API работать с данными, не занимаясь мелочью типа открыть-закрыть файл, (де)сериализовать данные (настройки всякие), записать/прочесть блок данных. Ими занимается драйвер СУБД (обычно библиотека) и сама СУБД.

Дополнительный гибридный вариант - использовать файлы локально и удалённо (с SDK): допустим с каким-нибудь объектным хранилищем, по протоколу S3 или другому. Как вариант, даже, использовать драйвер VFS для прозрачной работы с неким хранилищем, которое с точки зрения настольного приложения будет работать, как обычная ФС.

Для примеров можно взять типичные приложения типа веб-браузера или какого-нибудь мессенджера и посмотреть какие технологии используются в них.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@alexalexes
sqlite - для хранения метаданных файлов и виртуальных путей расположения (с точки зрения внутренней логики приложения).
Плюс физический каталог media для сохранения содержимого файлов в одном или нескольких подкаталогах, рассортированных по расширению (виду контента), с именем в виде уникального хеша (хеш записывается в метаданные в качестве ссылки на media).
По-моему, это самое распространенное решение, если взглянуть на внутренности популярных мессенджеров.
Ответ написан
Комментировать
uvelichitel
@uvelichitel
habrahabr.ru/users/uvelichitel
В posix системах архивы принято держать и распространять в формате tar. Бинарный архив без сжатия https://ru.wikipedia.org/wiki/Tar При желании можно сжать, получится .tar.gz Пользуюсь ежедневно.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы