磁盘备份STL容器类? [关闭](Disk-backed STL container class

2019-08-17 01:37发布

我喜欢开发使用STL算法,但是,我有这个经常出现的问题在我的数据集是堆太大。

我一直在寻找的STL容器和算法这是磁盘备份的直接替代,即数据结构存储在磁盘上,而不是堆。

最近有朋友指出我朝着stxxl 。 以前我太参与吧...任何其他磁盘备份STL的替代品可用,我应该考虑?

注:我没有兴趣在持续或嵌入式数据库。 请不要提及的boost ::系列化,POST ++,关系模板库,Berkeley DB的,SQLite的,等我知道这些项目,并使用他们时,他们是适合我的目的。

更新:有几个人都提到内存映射文件,并使用自定义分配器,好的建议BTW,但我会指出他们的讨论在这里大卫亚伯拉罕表明,将需要对磁盘备份容器定制迭代器。 这意味着自定义分配器的方法是不可能奏效。

Answer 1:

我已经实现了一些东西非常相似。 实施迭代器是最具挑战性。 我用的boost :: iterator_facade实现迭代器。 使用boost::iterator_facade你可以很容易适应磁盘的数据结构的任何缓存有一个STL容器接口。



Answer 2:

我从来没有做任何事情很喜欢这一点,但它也许可以做你想要写自定义分配器,使得使用内存映射文件要备份你的数据做什么。

见的boost :: interprocesses他们易于使用的执行内存文档映射文件, 这多布斯医生文章的写作分配器的详细讨论,而这IEEE软件列的问题,并说明示例代码 。



Answer 3:

如果(你写)你不感兴趣的持久性的最简单的解决办法是增加你堆大小和使用操作系统的虚拟内存功能。 ,将不适合在您的计算机的物理内存会落得堆的一部分被寻呼磁盘上,给你你想要什么:数据正常STL经常访问存储在磁盘上。 操作系统会照顾在物理内存中缓存最常用的网页,并驱逐到磁盘那些你不使用大量的。 您的代码将保持不变,并可以通过添加更多的物理内存只是提高其性能。

要增加堆大小,检查你的操作系统的参数,如的ulimit(1)在Unix系统和系统属性 - 高级 - 性能 - 高级 - 在Windows XP虚拟内存。 如果你已经打了32位4GB的限制考虑迁移到64位架构或编译程序为64位。



Answer 4:

我不知道很多有关的主题,但有可能写一个STL一样的界面,以内存映射文件?

编辑:如果你想要知道的一个巨大的文件的特定部分,这种方法可能是合适的。 如果你试图做整个文件的东西,你可能会为你在文件中未缓存部分阅读产生页面错误的数量巨大。



文章来源: Disk-backed STL container classes? [closed]