随机访问容器不适合内存?

时间:2010-01-25 19:30:32

标签: c++ database memory data-structures random-access

我有一个对象数组(比如图像),它太大而无法放入内存(例如40GB)。但是我的代码需要能够在运行时随机访问这些对象。

最好的方法是什么?

从我的代码的角度来看,当然,如果某些数据存在于磁盘上或临时存储在内存中,则无关紧要;它应该具有透明访问权限:

container.getObject(1242)->process();
container.getObject(479431)->process();

但是我应该如何实现这个容器呢?它应该只是将请求发送到数据库吗?如果是这样,哪一个是最佳选择? (如果是一个数据库,那么它应该是免费的而不是太多的管理麻烦,也许Berkeley DB或sqlite?)

我是否应该自己实现它,在访问沙子时将内存记忆清除,当内存已满时?或者那里有好的库(C ++)吗?

容器的要求是最小化磁盘访问(我的代码可能会更频繁地访问某些元素,因此它们应保存在内存中)并允许快速访问。

更新:我发现STXXL不能解决我的问题,因为我存储在容器中的对象具有动态大小,即我的代码可能会更新它们(增加或减少某些对象的大小) )在运行时。但是STXXL无法解决这个问题:

  

STXXL容器假定数据   他们存储的类型是普通的旧数据   类型(POD)。   http://algo2.iti.kit.edu/dementiev/stxxl/report/node8.html

您能否对其他解决方案发表评论?那么使用数据库呢?哪一个?

5 个答案:

答案 0 :(得分:8)

考虑使用STXXL

  

STXXL的核心是一个实现   C ++标准模板库   外部存储器的STL(核外)   计算,即STXXL实现   容器和算法可以   仅处理大量数据   适合磁盘。虽然兼容性   STL支持易用性和   与现有的兼容性   应用,另一个设计优先级   是高性能。

答案 1 :(得分:1)

您可以查看内存映射文件,然后再访问其中一个文件。

答案 2 :(得分:1)

我会实现一个基本缓存。使用此工作集大小,您将获得具有x字节缓存行的set-associative-cache的最佳结果(x ==最符合您访问模式的内容)。只需在软件中实现每个现代处理器已有的硬件。这应该给你imho最好的结果。如果你可以优化访问模式以某种方式线性,你可以进一步优化它。

答案 3 :(得分:0)

一种解决方案是使用类似于B-Tree,索引和数组或向量的“页面”的结构。概念是索引用于确定加载到内存中的页面以访问您的变量。

如果缩小页面大小,则可以在内存中存储多个页面。基于使用频率或其他规则的缓存系统将减少页面加载的数量。

答案 4 :(得分:0)

我见过一些非常聪明的代码,它会重载operator[]()来动态执行磁盘访问,并透明地从磁盘/数据库加载所需的数据。