【问题标题】:How to append a large number of elements to stxxl vector efficiently?如何有效地将大量元素附加到stxxl向量?
【发布时间】:2014-11-24 20:37:56
【问题描述】:

我需要将大量元素附加到 stxxl 向量。将元素添加到 stxxl 向量的最有效方法是什么?现在,我正在使用 stxxl 向量的 push_back,但它似乎效率不高。它远未使磁盘带宽饱和。有没有更好的办法?

谢谢, 大

【问题讨论】:

  • 以前从未做过类似的事情,但你可以试试这个:在常规 STL 容器中存储相对大量的值。当达到某个限制时,然后调整 STXXL 容器的大小以调整 STL 容器中的数量。使用直接迭代器访问用 STL 值填充新的 STXXL 位置。
  • stxxl的向量有reserve吗?
  • @TimSeguine:是的:stxxl.sourceforge.net/tags/1.4.1/…

标签: c++ vector stxxl


【解决方案1】:

关于"Efficient Sequential Reading and Writing to Vectors" 的大部分内容都适用于您的情况。

除了使用命令式循环填充向量的 vector_bufwriter 之外,还有一个 stxxl::stream::materialize() 的变体,它以函数式编程风格进行。

关于事先知道向量的大小:这对于 EM 来说并不是必需的,因为可以动态分配块。然后这些通常不会按顺序排列,但就这样,无论如何都不能保证。

如果填充到达向量的末端,我看到有人(我)自动将 vector_bufwriter 加倍向量的大小。目前,我认为这没有必要,也许应该改变这种行为。

【讨论】:

    【解决方案2】:

    根据the documentation

    如果只需要在n/B I/O 中将元素顺序写入向量,目前最快的方法是stxxl::generate

    虽然没有真正回答为什么 push_back 应该是 I/O 效率低下的。

    【讨论】:

    • 我猜这与矢量调整大小有关。
    【解决方案3】:

    一种方法:

    • 首先reserve 您需要的元素数量。使用某些类型调整矢量的大小可能非常耗时。随着向量的增长,添加许多元素会导致多次调整大小。

    • 调整大小后,使用emplace_back 追加(如果类型很简单,则直接推送,例如int)。

    还要查看成员函数。很适合您的需求的实现可能已经存在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-17
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 2012-10-05
      • 1970-01-01
      • 2013-07-17
      • 1970-01-01
      相关资源
      最近更新 更多