J'essaye de charger des résultats de simulation d'un fichier dans un vecteur. Le code fonctionne bien pour les petites et moyennes quantités de données. Quand j'essaye de charger de gros fichiers, je reçois une exception. Le tableau qui fait planter mon programme est d'environ 17000 * 7 * 3000 éléments. J'ai essayé de fractionner l'initialisation en quelques étapes, mais il s'est également écrasé. Pourriez-vous s'il vous plaît me dire si je peux faire quelque chose pour le faire fonctionner?Initializaton de grand vecteur multidimensionnel C++
//////////////////////////////////////////////////////////
//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;
}
}
}
}
}
L'endroit où une exception occures est tab_wj.push_back...
Quand j'ai essayé de diviser l'initialisation en plus d'une étape, j'ai écrit:
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);
Ensuite, il est écrasé enfin une de ces lignes.
Merci pour toute aide!
17000 * 7 * 3000 * 4 octets (en supposant que float32 a une longueur de 4 octets) = 1 428 000 000. C'est un giga-octet et demi. Peut-être n'avez-vous pas assez de RAM ou d'espace d'échange suffisant. –
J'ai 8 Go de RAM donc ça devrait aller. – wavelet
Même si vos 8 Go ne sont pas tous assignés à votre programme. Je vous suggère d'utiliser valgrind pour trouver la racine de votre problème. – user3630220