Управление ссылками в векторном диске

Я разрабатываю набор векторных классов, которые все получены из абстрактного вектора. Я делаю это так, чтобы в нашем программном обеспечении, которое использует эти векторы, мы могли быстро переключаться между векторами без какого-либо нарушения кода (или, по крайней мере, минимизировать сбои, но моя цель — полная совместимость). Все векторы совпадают.

Я работаю над дисковым вектором, который в основном соответствует реализации вектора STL. Я делаю это, потому что нам нужно обрабатывать большие файлы вне памяти, которые содержат различные форматы данных. Дисковый вектор обрабатывает данные для чтения / записи на диск, используя специализацию шаблонов / полиморфизм классов сериализации и десериализации. Сериализация и десериализация данных была проверена, и она работает (до сих пор). Моя проблема возникает при работе со ссылками на данные.

Например,

Учитывая DiskVector dvвызов dv[10] получит точку на месте на диске, затем будет искать там, считывать поток символов. Этот поток передается десериализатору, который преобразует поток байтов в соответствующий тип данных. Как только у меня будет ценность, я ее верну.

Здесь я сталкиваюсь с проблемой. В STL они возвращают его как ссылку, поэтому, чтобы соответствовать их стилю, мне нужно вернуть ссылку. То, что я делаю, хранит значение в unordered_map с заданным индексом (в данном примере 10). Затем я возвращаю ссылку на значение в unordered_map.

Если это продолжается без очистки, то цель DiskVector теряется, потому что все данные просто загружаются в память, что плохо из-за размера данных. Поэтому я очищаю эту карту, удаляя индексы позже, когда делаются другие вызовы. К сожалению, если пользователь решил сохранить эту ссылку в течение длительного времени, а затем она удаляется в DiskVector, у нас есть проблема.

Итак, мои вопросы

  • Есть ли способ узнать, используются ли какие-либо другие ссылки на определенный экземпляр?
  • Есть ли лучший способ решить эту проблему, сохраняя полиморфный стиль по причинам, описанным в начале?
  • Можно ли создать специальный класс, который будет вести себя как ссылка, но обрабатывать дисковый ввод-вывод динамически, чтобы я мог просто вернуть его вместо этого?
  • Есть другие идеи?

1

Решение

Поэтому лучшее решение, которое я пытался сделать, — это использовать SQLite в качестве бэкэнда для базы данных. Используйте BLOB-объекты в качестве типов столбцов для столбцов ключа и значения. Это подход, который я использую сейчас. Тем не менее, чтобы заставить его работать хорошо, мне нужно использовать то, что cdhowie опубликовал в комментариях к моему вопросу.

0

Другие решения