我需要将大量元素附加到stxxl向量中。向stxxl向量添加元素的最有效方式是什么?现在,我使用stxxl向量的push_back,但它看起来效率不高。这远远没有饱和磁盘带宽。有没有更好的办法?如何有效地将大量元素添加到stxxl矢量?
谢谢, 沓
我需要将大量元素附加到stxxl向量中。向stxxl向量添加元素的最有效方式是什么?现在,我使用stxxl向量的push_back,但它看起来效率不高。这远远没有饱和磁盘带宽。有没有更好的办法?如何有效地将大量元素添加到stxxl矢量?
谢谢, 沓
如果一个仅需要顺序地写元件到载体在
n/B
I/O的当前最快的方法是stxxl::generate。
虽然没有真正回答为什么push_back
应该是I/O效率低下。
我的猜测是这与矢量调整大小有关。 – flakes 2014-11-24 20:58:21
大部分关于"Efficient Sequential Reading and Writing to Vectors"的内容适用于您的案例。
除了使用命令循环填充矢量的vector_bufwriter,还有一个stxxl :: stream :: materialize()函数编程风格的变体。
关于以前知道矢量的大小:这对于EM来说并不是必须的,因为可以动态地分配块。这些通常不会有条不紊,但如此做,无论如何都不能保证。
我看到有人(我)自动制作了vector_bufwriter double如果填充到达矢量的末尾,矢量的大小。目前,我不认为这是必要的,也许应该改变这种行为。
一种方法:
首先reserve
你需要的元素数量。使用某些类型调整矢量大小可能非常耗时。随着矢量的增长,追加许多元素可能会导致一些调整大小。
调整大小后,使用emplace_back
附加(如果类型不重要,也可以简单推送,例如int
)。
也审查成员函数。一个适合您需求的实现可能已经存在。
以前从未做过这样的事情,但你也许可以试试这个:在一个普通的STL容器中存储相对大量的值。达到一定限制后,调整STXXL容器的大小以调整STL容器中的数量。使用直接迭代器访问来填充新的STXXL位置和STL值。 – flakes 2014-11-24 20:55:14
stxxl的矢量是否有'储备'? – 2014-11-24 20:56:38
@TimSeguine:是的:http://stxxl.sourceforge.net/tags/1.4.1/classstxxl_1_1vector.html#a07c6c6ec13a7a0324c34aad594dac9b7 – Nemo 2014-11-24 23:14:34