40

我喜欢使用 STL 开发算法,但是,我经常遇到这个问题,即我的数据集对于堆来说太大了。

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

一位朋友最近向我指出了stxxl。在我过多参与之前......我应该考虑是否有其他可用的磁盘支持的 STL 替代品?

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

更新:有几个人提到了内存映射文件和使用自定义分配器,顺便说一句,这是很好的建议,但我会指出他们在这里的讨论中,大卫亚伯拉罕建议磁盘支持的容器需要自定义迭代器。这意味着自定义分配器方法不太可能奏效。

4

4 回答 4

10

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

于 2008-09-30T03:06:36.380 回答
8

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

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

于 2008-09-29T17:32:49.783 回答
3

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

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

于 2008-09-29T16:46:25.247 回答
2

我对这个主题不太了解,但是可以将类似 STL 的接口写入内存映射文件吗?

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

于 2008-09-29T16:38:48.820 回答