我需要將大量元素附加到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