Я разрабатываю набор векторных классов, которые все получены из абстрактного вектора. Я делаю это так, чтобы в нашем программном обеспечении, которое использует эти векторы, мы могли быстро переключаться между векторами без какого-либо нарушения кода (или, по крайней мере, минимизировать сбои, но моя цель — полная совместимость). Все векторы совпадают.
Я работаю над дисковым вектором, который в основном соответствует реализации вектора STL. Я делаю это, потому что нам нужно обрабатывать большие файлы вне памяти, которые содержат различные форматы данных. Дисковый вектор обрабатывает данные для чтения / записи на диск, используя специализацию шаблонов / полиморфизм классов сериализации и десериализации. Сериализация и десериализация данных была проверена, и она работает (до сих пор). Моя проблема возникает при работе со ссылками на данные.
Например,
Учитывая DiskVector dv
вызов dv[10]
получит точку на месте на диске, затем будет искать там, считывать поток символов. Этот поток передается десериализатору, который преобразует поток байтов в соответствующий тип данных. Как только у меня будет ценность, я ее верну.
Здесь я сталкиваюсь с проблемой. В STL они возвращают его как ссылку, поэтому, чтобы соответствовать их стилю, мне нужно вернуть ссылку. То, что я делаю, хранит значение в unordered_map с заданным индексом (в данном примере 10). Затем я возвращаю ссылку на значение в unordered_map.
Если это продолжается без очистки, то цель DiskVector теряется, потому что все данные просто загружаются в память, что плохо из-за размера данных. Поэтому я очищаю эту карту, удаляя индексы позже, когда делаются другие вызовы. К сожалению, если пользователь решил сохранить эту ссылку в течение длительного времени, а затем она удаляется в DiskVector, у нас есть проблема.
Итак, мои вопросы
Поэтому лучшее решение, которое я пытался сделать, — это использовать SQLite в качестве бэкэнда для базы данных. Используйте BLOB-объекты в качестве типов столбцов для столбцов ключа и значения. Это подход, который я использую сейчас. Тем не менее, чтобы заставить его работать хорошо, мне нужно использовать то, что cdhowie опубликовал в комментариях к моему вопросу.