[英]Big multidimensional vector initializaton C++
我正在嘗試將模擬結果從文件加載到向量中。 該代碼適用於中小數據量。 當我嘗試加載大文件時,出現異常。 使我的程序崩潰的數組大約有 17000*7*3000 個元素。 我試過將初始化分成幾個步驟,但它也崩潰了。 你能告訴我我是否可以做些什么來使它工作嗎?
//////////////////////////////////////////////////////////
//Import of surface receivers file
for(int freq=0;freq<7;freq++)
{
filePath=filePath_old;
filePath.Replace(wxT("125 Hz"),wxString::Format(wxT("%i"), freqSTI[freq])+wxT(" Hz"));
if(importer.ImportBIN(filePath,mainData))
{
if(timeTable.size()==0){
for(int idstep=0;idstep<mainData.nbTimeStep;idstep++)
{
timeTable.push_back(mainData.timeStep*(idstep+1)*1000);
}
}
for(wxInt32 idrs=0;idrs<mainData.tabRsSize;idrs++)
{
for(wxInt32 idface=0;idface<mainData.tabRs[idrs].dataRec.quantFaces;idface++)
{
if(tab_wj.size()<idrs+1){
tab_wj.push_back(std::vector<std::vector<std::vector<wxFloat32> > > (mainData.tabRs[idrs].dataRec.quantFaces,std::vector<std::vector<wxFloat32> >(7,std::vector<wxFloat32>(mainData.nbTimeStep,0.f))));
}
//Pour chaque enregistrement de cette face
int tmp=mainData.tabRs[idrs].dataFaces[idface].dataFace.nbRecords;
for(wxInt32 idenr=0;idenr<mainData.tabRs[idrs].dataFaces[idface].dataFace.nbRecords;idenr++)
{
t_faceValue* faceval=&mainData.tabRs[idrs].dataFaces[idface].tabTimeStep[idenr];
tab_wj[idrs][idface][freq][faceval->timeStep]=faceval->energy;
}
}
}
}
}
發生異常的地方是tab_wj.push_back...
當我試圖將初始化分成多個步驟時,我寫道:
std::vector<wxFloat32> t1(mainData.nbTimeStep,0.f);
std::vector<std::vector<wxFloat32> > t2(7,t1);
std::vector<std::vector<std::vector<wxFloat32> > > t3(mainData.tabRs[idrs].dataRec.quantFaces,t2);
然后它在這些線路中的最后一條崩潰了。
謝謝你的幫助!
看起來它在分配內存時出現異常。 std::vector<> 必須在向其添加新項目時重新分配其存儲。 它不會為每個 push_back() 執行此操作,因為它分配的內容超出了它的需要。 一個大小為 5 的 vector<> 實際上可能有 8 個項目的空間(size() vs. capacity())。 當您插入第 9 個項目時,它必須重新分配,通常它的容量會翻倍(從 8 到 16 (*))。
這種重新分配可能會使您的堆碎片化。 為了改進,您可以將向量預先分配到它最終需要的大小,因此它永遠不需要重新分配。 vector::reserve() 因此,如果您知道最終將需要 17000*7*3000,請預先保留它。
此外,如果您有很多小向量,則以較小的大小分配它們可以減少您的內存需求。 通常 vector<> 的默認大小可能是 8 或 16。如果您只插入 3 個項目,那么您將浪費大量存儲空間。 在分配向量期間,我相信您可以指定其初始容量。
由於您使用的是嵌套向量,因此它們中的每一個都將依次具有自己的分配。 根據您的 C++ 版本,將向量推入向量可能會導致多次分配。
您可以嘗試將代碼重構為不需要嵌套向量。
(*):當需要更多空間時,一個簡單的向量實現會將分配大小加倍,但出於多種原因,1.6 的因子更好(它與 big-O 效率一樣高,並導致更少的內存碎片)。 參見“黃金比例”: https : //en.wikipedia.org/wiki/Golden_ratio
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.