2014-11-24 100 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)。

也審查成員函數。一個適合您需求的實現可能已經存在。