C ++ - 管理基于磁盘的向量中的引用

时间:2014-12-05 16:10:52

标签: c++ vector reference polymorphism disk-io

我正在开发一组所有从抽象向量派生的向量类。我这样做是为了在我们使用这些向量的软件中,我们可以在没有任何代码中断的情况下快速切换向量(或者至少最小化失败,但我的目标是完全兼容)。所有的矢量都匹配。

我正在研究一种基于磁盘的矢量,它主要符合STL Vector的实现。我这样做是因为我们需要处理包含各种格式数据的大量内存不足文件。磁盘向量通过使用序列化和反序列化类的模板特化/多态来处理对磁盘的读/写数据。数据序列化和反序列化已经过测试,并且可以使用(到目前为止)。处理数据引用时出现问题。

例如,

给定一个DiskVector dv,对dv[10]的调用将指向磁盘上的某个点,然后在那里寻找,读出char流。此流将传递给deserializor,后者将字节流转换为适当的数据类型。一旦我有了价值,我就归还它。

这是我遇到问题的地方。在STL中,它们将其作为参考返回,因此为了匹配它们的样式,我需要返回一个引用。我做的是将值存储在具有给定索引的unordered_map中(在本例中为10)。然后我返回对unordered_map中值的引用。

如果继续没有清理,那么DiskVector的用途就会丢失,因为所有数据都会被加载到内存中,由于数据大小这很糟糕。所以我通过稍后在进行其他调用时删除索引来清理此映射。不幸的是,如果用户决定长时间存储此引用,然后在DiskVector中删除它,我们就会遇到问题。

所以我的问题

  • 有没有办法查看是否正在使用对某个实例的任何其他引用?
  • 有没有更好的方法来解决这个问题,同时仍然保持多态风格的原因在开头描述?
  • 是否可以构建一个特殊的类,它可以作为引用,但是动态处理磁盘IO,所以我可以直接返回它?
  • 还有其他想法吗?

1 个答案:

答案 0 :(得分:0)

因此,我尝试做的更好的解决方案是使用SQLite作为数据库的后端。使用BLOB作为键和值列的列类型。这是我现在采取的方法。也就是说,为了让它运作良好,我需要使用cdhowie在评论中发布的问题。