0

我正在開發一個應用程序,該應用程序使用boost multi_array動態分配以創建一個3D點雲,以創建一個3D Voronoi圖,以存儲整個圖表。Large 3D volume bad_alloc

一個我使用的測試用例需要大量的存儲器(圍繞[600] [600] [600]),其超過了極限允許和在bad_alloc的結果。

我已經嘗試過在小塊圖分離,而且它不工作,因爲它似乎總內存已超過極限。

我的問題是,我怎麼能與下PC的限制,例如大型3D體積工作?

*編輯

元素類型是一個結構如下:

struct Elem{ 
    int R[3]; 
    int d; 
    int label; 
} 

的元素基於其在3D空間中的位置的多陣列索引。

的多陣列是由從文件上的空間設置的特定點,然後通過前向和後向掩模越過整個空間填充的中間空間構成。

在此先感謝

回答

0

你沒有說你如何得到你所有的觀點。如果您從文件中讀取它們,則不要全部讀取它們。如果你計算它們,那麼你可以根據需要重新計算它們。在這兩種情況下,你都可以實現一些緩存來存儲最常用的緩存。如果您知道算法將如何使用這些數據,那麼您可以預測下一步需要哪些值。你甚至可以在不同的線程中做到這一點。

第二種解決方案是讓他們適應你的RAM上的數據進行工作。你有216萬分,但我們不知道一分的大小。他們是3D,但他們使用浮動或雙打?他們是一個階級還是簡單的結構?他們有vtable嗎?你使用Debug版本嗎? (在Debug對象中可能會更大)。你是在開始還是增量分配整個數組?我相信在當前PC上存儲216M的3D點應該沒有問題,但這取決於所有這些問題的答案。

這使我想到的第三個方法是使用內存映射文件,但我從來沒有使用過個人。


這裏有幾件事情嘗試:

嘗試在不同批次分配,如:1 * 216M,1K * 216k,1M * 216,看你有多少內存可以得到。

嘗試將提升映射更改爲std :: vector甚至原始void *並比較可以獲得的最大RAM。

0

您沒有提及元素類型。給元素是一個四字節的float,一個600 * 600 * 600的矩陣只需要820M字節,實際上並不是很大。我建議你檢查一下你的操作系統對每個進程的內存使用量的限制。對於Linux,請使用ulimit -a進行檢查。

如果您確實無法在內存中分配矩陣,請使用mmap在磁盤上創建所需大小的文件將其映射到內存。然後將由mmap返回的內存地址傳遞給boost::multi_array_ref