我喜欢使用STL开发算法,但是,我有这个反复出现的问题,我的数据集对于堆来说太大了。

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

一位朋友最近向我指出了 stxxl 。在我太介入之前......我应该考虑使用其他任何支持磁盘的STL替换吗?

注意:我对持久性或嵌入式数据库不感兴趣。请不要提及boost :: serialization,POST ++,Relational Template Library,Berkeley DB,sqlite等。我知道这些项目,并在适合我的目的时使用它们。

更新:有几个人提到内存映射文件并使用自定义分配器,BTW提出了很好的建议,但我会指出他们讨论这里 David Abraham建议磁盘支持的容器需要自定义迭代器。这意味着自定义分配器方法不太可行。

有帮助吗?

解决方案

我已经实现了一些非常相似的东西。实现迭代器是最具挑战性的。我使用 boost :: iterator_facade 实现迭代器。使用 boost :: iterator_facade ,您可以轻松调整 磁盘数据结构上的任何缓存,以拥有STL容器接口。

其他提示

我从来没有做过这样的事情,但是有可能通过编写一个利用内存映射文件来备份数据的自定义分配器来做你想做的事。

请参阅 boost ::关于内存映射文件易于使用的文档的文档间过程这篇Dobbs博士的文章有关编写分配器的详细讨论,以及此IEEE软件专栏中有关描述问题和示例代码

如果(在您编写时)您对持久性不感兴趣,最简单的解决方案是增加堆大小并使用操作系统的虚拟内存设施。堆中不适合您计算机物理内存的部分将最终在磁盘上进行分页,为您提供您想要的内容:对通常存储在磁盘上的数据的正常STL访问。操作系统将负责缓存物理内存中最常用的页面,并将那些不经常使用的磁盘逐出。您的代码将保持不变,只需添加更多物理内存即可提高其性能。

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

我对这个主题了解不多,但是有可能为内存映射文件编写类似STL的接口吗?

编辑:如果你想要获取一个巨大文件的特定部分,这种方法可能是合适的。如果您尝试对整个文件执行某些操作,则在读取文件的未缓存部分时,可能会产生大量页面错误。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top