磁盘支持的STL容器类?
我喜欢使用STL开发算法,但是,我经常遇到这样的问题,即我的数据集对于堆来说太大了。
我一直在寻找由磁盘支持的STL容器和算法的即用型替代品,即存储在磁盘而不是堆上的数据结构。
最近有一个朋友将我指向stxxl。在我太参与其中之前...是否应该考虑其他磁盘支持的STL替代产品?
注意:我对持久性或者嵌入式数据库不感兴趣。请不要提及boost :: serialization,POST ++,关系模板库,Berkeley DB,sqlite等。我知道这些项目,并在适合我的目的时使用它们。
更新:有人提到了内存映射文件并使用了自定义分配器,这是不错的建议,但我要指出的是David Abraham建议在磁盘支持的容器中需要自定义迭代器的讨论。这意味着自定义分配器方法不太可能起作用。
解决方案
我对这个主题不太了解,但是可能可以将类似于STL的接口写到内存映射文件中吗?
编辑:如果我们要获取大文件的特定部分,则此方法可能是合适的。如果我们尝试对整个文件执行某些操作,则在读取文件的未缓存部分时,很可能会产生大量的页面错误。
如果(如我们所写)对持久性不感兴趣,则最简单的解决方案是增加堆大小并使用操作系统的虚拟内存功能。堆中不适合计算机物理内存的部分最终将被分页到磁盘上,从而为我们提供所需的内容:对通常存储在磁盘上的数据进行常规STL访问。操作系统将负责将物理内存中最常用的页面缓存起来,并驱逐到磁盘上我们不经常使用的页面。代码将保持不变,我们可以通过添加更多物理内存来提高其性能。
要增加堆大小,请检查操作系统的参数,例如Unix系统上的ulimit(1)和Windows XP上的系统属性Advanced Performance Advanced Virtual Memory。如果我们遇到了32位4GB的限制,请考虑迁移到64位体系结构或者将程序编译为64位。
我从来没有做过这样的事情,但是通过编写一个使用内存映射文件来备份数据的自定义分配器,可能可以做我们想做的事情。
请参阅boost :: interprocesses,以获取有关其易于使用的内存映射文件实现的文档;有关Dobbs博士的文章,有关编写分配器的详细讨论,请参见IEEE软件专栏,有关问题的描述和示例代码。
我已经实现了一些非常相似的东西。实现迭代器是最具挑战性的。我使用boost :: iterator_facade实现了迭代器。使用boost :: iterator_facade
可以很容易地使磁盘数据结构上缓存的任何内容具有STL容器接口。