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