我有一个对象数组(比如图像),它太大而无法放入内存(例如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
您能否对其他解决方案发表评论?那么使用数据库呢?哪一个?
答案 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[]()
来动态执行磁盘访问,并透明地从磁盘/数据库加载所需的数据。