c++ - 不适合内存的随机访问容器?

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

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

最好的方法是什么?

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

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

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

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

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

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

STXXL containers assume that the data types they store are plain old data types (POD). http://algo2.iti.kit.edu/dementiev/stxxl/report/node8.html

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

最佳答案

考虑使用 STXXL :

The core of STXXL is an implementation of the C++ standard template library STL for external memory (out-of-core) computations, i.e., STXXL implements containers and algorithms that can process huge volumes of data that only fit on disks. While the compatibility to the STL supports ease of use and compatibility with existing applications, another design priority is high performance.

关于c++ - 不适合内存的随机访问容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2135002/

相关文章:

c++ - boost::asio::async_read 在不满足完成条件的情况下结束

c++ - 捕获vector.erase()

c++ - 类型转换 PTLib PString -> std::string

php - 如何从xampp连接到网站的数据库

c - 特定地址的内存转储的最佳数据类型

swift - Swift 中的内存使用

c++ - 为什么将 COM 指针参数强制转换为 void 而不是 IUnknown?

Java、ResultSet.close()、PreparedStatement.close()——有什么用?

php - 与 mySQL 相关的数据库名称

ios - 应用程序可能会从后台返回什么样的 "zombie"?