У меня есть программа, в которой я хочу иметь возможность хранить определенные данные (динамически выделенные блоки), на диске для уменьшения использования памяти и сохранения.
Моя первая мысль заключалась в том, чтобы написать собственный собственный распределитель, который управлял содержимым файлов на диске, но я хочу посмотреть, какие альтернативы там тоже.
Я рассмотрел специализированные распределители памяти и темы сериализации объектов, но при этом адаптируются эти принципы к управлению адресным пространством файла. Существуют незначительные различия, как хорошие, так и плохие.
В этой ситуации:
-
Доступ к памяти осуществляется только через функции ввода-вывода (чтение/запись), а не напрямую
-
Объекты (методы/указатели) не хранятся, а только данные.
-
Размер файла не является статическим, поэтому он должен расти, когда это необходимо, а не быть большим и статическим
-
Для моих целей допустимо повторно отображать существующие указатели после дефрагментации
Поскольку данные не имеют фиксированного размера, большинство реализаций базы данных выглядят недостаточно хорошо.
Я спрашиваю, какой лучший подход для этой проблемы? Должен ли я реализовать простой распределитель памяти, который обрабатывает файл как кучу?
Для справки im использует С++ для встроенных устройств.
Изменить: я реализовал свой собственный менеджер памяти, который использует распределение памяти приятеля и размеры блоков в два раза. Я доволен, что это правильно и не течет, сглаживает свободные блоки и может сделать дефрагментацию "остановить мир".
Проблема заключается в том, что, как и ожидалось, существует довольно много внутренней и внешней фрагментации. Я не специалист в этой области, и хотя я считаю это увлекательным (я все еще студент), мне интересно, есть ли какие-либо другие реализации, которые сделали то же самое или подобное? Неужели я не могу быть единственным?
Некоторые полезные, но до сих пор несовместимые темы:
mmap tbh Я havent использовал mmap, но он обращается к файлу IO, но не к управлению адресным пространством файла.
BOOST: сериализация У меня есть (возможно, необоснованное) нежелание использовать библиотеки boost на данный момент.
STXXL Интересно, но не адресует выделение памяти с переменным размером
Doug Lea Memory Allocator Имеет очень хорошее представление о проблемах с распределителями памяти, но я не в состоянии попытаться сделать свой собственный реализация