C++ 内存中不适合的随机访问容器?

C++ 内存中不适合的随机访问容器?,c++,database,memory,data-structures,random-access,C++,Database,Memory,Data Structures,Random Access,我有一个对象数组(比如图像),它太大,无法放入内存(例如40GB)。但我的代码需要能够在运行时随机访问这些对象 最好的方法是什么 从我的代码的角度来看,当然,如果一些数据在磁盘上或临时存储在内存中,这并不重要;它应该有透明的访问: container.getObject(1242)->process(); container.getObject(479431)->process(); 但是我应该如何实现这个容器呢?它是否应该将请求发送到数据库?如果是,哪一个是最好的选择?(如果是一

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

最好的方法是什么

从我的代码的角度来看,当然,如果一些数据在磁盘上或临时存储在内存中,这并不重要;它应该有透明的访问:

container.getObject(1242)->process();
container.getObject(479431)->process();
但是我应该如何实现这个容器呢?它是否应该将请求发送到数据库?如果是,哪一个是最好的选择?(如果是一个数据库,那么它应该是免费的,没有太多的管理麻烦,可能是Berkeley DB或sqlite?)

我是否应该自己实现它,在访问后记忆对象,并在内存已满时清除内存?或者有好的库(C++)来实现这一点吗

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

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

STXXL容器假定数据 它们存储的类型是普通的旧数据 类型(POD)。


请您对其他解决方案发表意见好吗?使用数据库怎么样?哪一个?

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

考虑使用:

STXXL的核心是一个实现 C++标准模板库的实现 外部存储器的STL(核心外) 计算,即STXXL实现 可以 处理大量数据,而这些数据 安装在磁盘上。而兼容性 到STL支持易用性和 与现有系统的兼容性 应用程序,另一个设计优先级 是高性能的


我将实现一个基本缓存。使用此工作集大小,您将获得具有x字节缓存线的集合关联缓存的最佳结果(x==与您的访问模式最匹配的内容)。只需在软件中实现每个现代处理器在硬件中已经具备的功能。这会给你最好的结果。如果你能优化accesspattern使其线性化,那么你可以进一步优化它。

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


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

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

在不了解更多有关您的问题的情况下,我会说两者(从磁盘读取并缓存一些结果;或者使用带有缓存的数据库)如果你正在修改对象,你不是在创建一个新对象吗?然后你要么拥有旧对象和新对象,要么删除旧对象并用新对象替换。这看起来不错,但我不知道是否可以告诉它缓存或预加载某些结果?例如,一旦我访问元素n,我可能很快就会访问从n-100到n+100的一些元素,所以它应该加载并存储在内存中。也许在这种情况下我需要自己的自定义解决方案?STXXL不适合我,请参阅我问题中的更新。还有其他想法吗?当然,我在问是否值得自己编写代码(如果值得,最好的方法是什么:数据库访问,等等?)或者代码是否可用。