磁盘支持的STL容器类?
我喜欢使用STL开发algorithm,但是,在我的数据集对于堆太大的情况下,我有这个反复出现的问题。
我一直在寻找替代STL容器和algorithm的磁盘备份,也就是存储在磁盘而不是堆上的数据结构。
最近朋友指出我对stxxl 。 在我涉及之前…是否有其他的磁盘备份STL替代品,我应该考虑?
注意:我对持久性或embedded式数据库不感兴趣。 请不要提及boost :: serialization,POST ++,关系模板库,Berkeley DB,sqlite等。我知道这些项目,并在适合我的目的时使用它们。
更新:有几个人提到了内存映射文件,并使用自定义分配器,很好的build议顺便说一句,但我会指出他们在这里的讨论David Abrahambuild议磁盘备份容器需要自定义迭代器。 这意味着自定义分配器的方法是不可能的。
我已经实现了一些非常相似的东西。 实现迭代器是最具挑战性的。 我用boost :: iterator_facade来实现迭代器。 使用boost::iterator_facade
你可以轻松地调整任何caching在磁盘数据结构上的STL容器接口。
我从来没有做过这样的事情,但是通过编写一个使用内存映射文件来备份数据的自定义分配器,可以做你想做的事情。
请参阅boost :: interprocesses文档,了解它们易于使用的内存映射文件的实现方法, 这篇Dr. Dobbs文章详细讨论了编写分配器的方法,以及这个IEEE Software专栏中对问题和示例代码的描述。
如果(如你所写)你对持久性不感兴趣,最简单的解决scheme就是增加堆的大小,并使用操作系统的虚拟内存设施。 堆中不适合计算机物理内存的部分最终将被分页到磁盘上,从而给你正是你想要的:正常的STL访问通常存储在磁盘上的数据。 操作系统将负责caching物理内存中使用最多的页面,并将这些页面转移到磁盘上,而这些不太常用。 您的代码将保持不变,只需添加更多的物理内存即可提高性能。
要增加堆大小,请检查操作系统的参数,例如Unix系统上的ulimit(1)和Windows XP上的系统属性 – 高级 – 性能 – 高级 – 虚拟内存。 如果你已经达到了32位4GB的限制,考虑转移到64位体系结构或编译你的程序64位。
我对这个主题不太了解,但是可以写一个类似于STL的接口到内存映射文件中?
编辑:这种方法可能是适合的,如果你想要获得一个巨大的文件的特定部分。 如果您试图对整个文件执行某些操作,那么在读取未caching的文件部分时,可能会生成大量的页面错误。