簡體   English   中英

大多維向量初始化 C++

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM