2013-12-09 110 views
2

我正在使用STXXL進行項目工作,我知道這是一個超出C++ STL庫的核心版本。目前,我的程序運行良好,但我現在面臨的問題是程序運行時,它使用接近2GB的內存(使用中低數據集)。STXXL的高內存使用情況

在我的程序中,我使用了25個STXXL向量,存儲在磁盤上的單個文件中。至於我的.stxxl文件,我目前已設置爲動態分配磁盤文件(通過將磁盤大小設置爲0)。

所以,我的問題是:有沒有辦法顯式地讓STXXL使用硬盤而不是RAM?或者,當使用這個庫時,預計這種內存使用量會是多少?

在此先感謝任何人可以提供的建議。

回答

3

說,有關的stxxl的RAM使用什麼bobb_the_builder:矢量是否正確。使用和 時約1.6吉布時使用正在

#include <stxxl/vector> 

int main() 
{ 
    // create vector 
    //stxxl::VECTOR_GENERATOR<int>::result vector[25]; 
    stxxl::VECTOR_GENERATOR<int, 1, 1, 1*1024*1024>::result vector[25]; 

    // fill vectors with integers 
    for (size_t i = 0; i < 100 * 1024 * 1024 * 1024llu; ++i) { 
     vector[i % 25].push_back(i); 
    } 

    return 0; 
} 

在Linux上,該程序的駐留內存大小長到 27528昆明植物研究所:

請看下面的代碼。

Windows管理器顯示相同嗎?這可能是僅在Windows上的STXXL錯誤,或者只是任務管理器顯示不同的內存大小?

+0

感謝Timo的例子!最後,我在考慮這些原則的情況下提出了一個新的解決方案,並且使用如下最小構造函數,我可以將內存使用降低到每個向量50 MB的合理值:'vector ( 1000000);'。感謝你的幫助! – Andrewziac

2

我想你正在使用STXXL::VECTOR_GENERATOR模板創建你在發佈中提到的25 stxxl::vectorstxxl::vector的內部存儲器使用情況一般取決於您的個人配置(即block_size * page_size * cache_pages),如STXXL documentation on STXXL::VECTOR_GENERATOR中所述。 這一切都歸結爲保留的內部(=主)內存消耗。 據我所知,STXXL試圖分配儘可能多的內存作爲您的容器使用(如果可能)作爲緩存取決於這些模板參數。

:所述默認用於上述模板的參數值是:

page_size = 4 
cache_pages = 8 
block_size = 2 MiB 

這導致25 *總存儲器消耗(2 MIB * 4 * 8)= 1600 MIB這解釋了您報告的2 GB內存消耗的很大一部分。

(注:其中DATA_TYPE(值類型)都存儲在您的STXXL矢量不應該真正的問題。)

+0

感謝您的信息!我已經提到了你提到的各種價值觀,並且讓我有點進一步,但是我現在看到的是,隨着我的程序向我的向量添加越來越多的元素,內存使用情況(如Windows任務管理器)開始快速增長(如前所述,高達2 GB)。我覺得它只是將整個矢量存儲在內存中,而不是使用硬盤。也許我之前應該提到這一點,但是我的媒介必須是全球性的,並且它們必須貫穿整個程序的運行過程,這是什麼原因造成的? – Andrewziac

+0

如果設置page_size = 1,cache_size = 1和block_size = 1 * 1024 * 1024(1 MiB),那麼您的主內存消耗有多高?你如何預定義和instanciate stxxl ::向量? –

+0

你如何預定義並實例化stxxl :: vectors?我的猜測是,你不會將足夠的值push_back到緩存溢出的向量中,並且元素需要在你的磁盤上逐塊存儲。請插入許多千兆字節的值,並檢查您的內存消耗是否超過2GB的限制。 –