2014-11-24 72 views
2

我需要将大量元素附加到stxxl向量中。向stxxl向量添加元素的最有效方式是什么?现在,我使用stxxl向量的push_back,但它看起来效率不高。这远远没有饱和磁盘带宽。有没有更好的办法?如何有效地将大量元素添加到stxxl矢量?

谢谢, 沓

+0

以前从未做过这样的事情,但你也许可以试试这个:在一个普通的STL容器中存储相对大量的值。达到一定限制后,调整STXXL容器的大小以调整STL容器中的数量。使用直接迭代器访问来填充新的STXXL位置和STL值。 – flakes 2014-11-24 20:55:14

+0

stxxl的矢量是否有'储备'? – 2014-11-24 20:56:38

+0

@TimSeguine:是的:http://stxxl.sourceforge.net/tags/1.4.1/classstxxl_1_1vector.html#a07c6c6ec13a7a0324c34aad594dac9b7 – Nemo 2014-11-24 23:14:34

回答

0

根据the documentation

如果一个仅需要顺序地写元件到载体在n/B I/O的当前最快的方法是stxxl::generate

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

+0

我的猜测是这与矢量调整大小有关。 – flakes 2014-11-24 20:58:21

2

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

除了使用命令循环填充矢量的vector_bufwriter,还有一个stxxl :: stream :: materialize()函数编程风格的变体。

关于以前知道矢量的大小:这对于EM来说并不是必须的,因为可以动态地分配块。这些通常不会有条不紊,但如此做,无论如何都不能保证。

我看到有人(我)自动制作了vector_bufwriter double如果填充到达矢量的末尾,矢量的大小。目前,我不认为这是必要的,也许应该改变这种行为。

0

一种方法:

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

  • 调整大小后,使用emplace_back附加(如果类型不重要,也可以简单推送,例如int)。

也审查成员函数。一个适合您需求的实现可能已经存在。