【问题标题】:Disk based STL replacement for c++c++ 的基于磁盘的 STL 替换
【发布时间】:2013-12-02 02:12:14
【问题描述】:

我最近构建了一个严重依赖 stl 队列的应用程序,并且遇到了内存问题,队列变得很大以适应机器内存。是否有任何磁盘支持的开源、IO / 内存高效队列实现可以插入到 stl 队列的位置,从而使我的应用程序神奇地使用更少的 RAM?

我想要一些具有读/写缓冲区机制的东西 - 因为我的应用程序每秒大约有 50k 入队/出队,而且对象相当小。

我的队列包含成对的 32 位整数,使每个条目占用 64 位,链表是不可能的,因为它们会使内存消耗加倍。

【问题讨论】:

  • 队列的底层容器是一个双端队列,如果你把它改成一个列表,它会更适合内存(以性能为代价)虽然双端队列的内存效率很高
  • @aaronman,老实说,我已经实现了一个基于循环数组的队列来压缩数据,我想要的是数量级,占用磁盘上的演出
  • 基于数组的队列不好,因为这样你就强制内存是连续的
  • @juanchopanza 这就是我的想法,但它似乎有点无人维护 - 那里没有 c++11 支持.. 我可能不得不自己添加它

标签: c++ memory stl


【解决方案1】:

是的,请尝试 STXXL。 但如果可以避免随机访问(即 operator[]),请不要使用双端队列。 使用 stxxl::sequence 代替,它在外部内存中是有效的。

免责声明:我正在恢复图书馆。如果你修复了 C++11 问题,请给我发一个补丁,这可能是由于 MacOSX 的工具链造成的。

【讨论】:

  • 它看起来像是一个宏检查的实例,检查 c++11 没有重新认识 Maveric 附带的 gcc ..
【解决方案2】:

我会考虑使用STXXL。它使用文件系统后端重新实现了许多 stl 容器接口。其中一种实现是用于双端队列结构。

【讨论】:

  • stxxl 最大的问题是它似乎没有维护.. 代码不会用 c++11 编译
  • 你确定它不能在 C++11 中编译吗?来自文档'对 C++0x 和 C++11 的支持已集成并自动检测。 STXXL 的核心部分都不需要 C++11。'
  • 可能只是测试。
  • 在 ../include/stxxl/bits/common/utils.h:29 包含的文件中:../include/stxxl/bits/compat/type_traits.h:19:10:致命错误: 'tr1/type_traits' 文件未找到#include
  • 开发人员似乎一直在积极更新您引用的特定文件——您的编译器似乎没有设置__GXX_EXPERIMENTAL_CXX0X__(我认为您正在使用 gcc?)。您可以请求该文件以将行修改为#if defined(__GXX_EXPERIMENTAL_CXX0X) || __cplusplus >= 201103L,这应该可以解决该问题。除此之外,任何库都可能存在编译器特定问题(但这有点超出了这个问题的范围)。
【解决方案3】:

std::queue 是一个容器适配器,这意味着它本质上是另一个容器的接口。在这种情况下,默认值为std::deque,它在内存中表示为常量大小数组的向量,因为该向量包含指向数组的指针,它非常适合内存。如果您需要更不连续的东西,您可以尝试将后端设置为std::list,链接结构通常可以更好地处理大量数据,因为它们不必是连续的。

你也可以给接口提供自己的后端,它必须满足SequenceContainer的要求

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 2015-02-03
    • 2010-10-04
    • 2012-02-29
    相关资源
    最近更新 更多