6

我有一个对象数组(比如图像),它们太大而无法放入内存(例如 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

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

4

5 回答 5

8

考虑使用STXXL

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

于 2010-01-25T19:34:48.733 回答
1

I would implement a basic cache. With this workingset size you will have the best results with a set-associative-cache with x byte cache-lines ( x == what best matches your access pattern ). Just implement in software what every modern processor already has in hardware. This should give you imho the best results. You could than optimize it further if you can optimize the accesspattern to be somehow linear.

于 2010-01-25T19:38:06.500 回答
1

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

于 2010-01-25T19:34:11.000 回答
0

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

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

于 2010-01-25T22:07:45.957 回答
0

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

于 2010-01-26T14:01:54.983 回答