我正在尝试将文件中的模拟结果加载到矢量中。该代码适用于中小量数据。当我尝试加载大文件时,我得到一个例外。使程序崩溃的数组大约是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);
然后它在最后一条线上坠毁了。
感谢您的帮助!
答案 0 :(得分:1)
看起来在分配内存时会出现异常。 的std ::矢量&lt;&GT;在向其添加新项目时必须重新分配其存储空间。 它不会为每个push_back()执行此操作,因为它分配的内容超过了它的需要。 矢量&lt;&gt;大小为5实际上可能有8个项目的空间(size()与capacity())。当您插入第9个项目时,它必须重新分配,通常它会使其容量加倍(从8到16(*))。
此重新分配可能会破坏您的堆。 为了改进你可以预先将矢量分配到它最终需要的大小,因此它永远不需要重新分配。矢量::储备() 所以,如果你知道你最终需要17000 * 7 * 3000,请事先保留。
另外,如果你有很多小矢量,那么分配小尺寸矢量会降低你的内存需求。通常矢量&lt;&gt;默认大小可以是8或16.如果你只插入3个项目,那么你浪费了大量的存储空间。在分配矢量期间,我相信您可以指定其初始容量。
由于您使用的是嵌套向量,因此每个向量都将拥有自己的分配。根据您的C ++版本,将向量推送到向量上会导致大量分配。
您可能会尝试重构代码以不需要嵌套向量。
(*):当需要更多空间时,天真的向量实现将使分配大小加倍,但由于多种原因(因为它的效率很高并且导致更少的内存碎片),1.6因子更好。请参阅&#34;黄金比例&#34;:https://en.wikipedia.org/wiki/Golden_ratio