C++ std::bad_alloc erreur
Je travaille sur un programme en C++ (C++ 98). Il lit un fichier texte avec beaucoup de lignes (10000 lignes). Ce sont des valeurs séparées par une tabulation, puis-je analyser dans le Vecteur des objets Vectoriels. Toutefois, Cela semble fonctionner pour certains fichiers (les plus Petits), mais l'Un de mes fichiers me donne l'erreur suivante (ce fichier a 10000 lignes et c'est 90 MO). Je devine que c'est une mémoire liée au problème?
Pouvez-vous svp m'aider?
Erreur
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Abort
Code
void AppManager::go(string customerFile) {
vector<vector<string> > vals = fileReader(customerFile);
for (unsigned int i = 0; i < vals.size();i++){
cout << "New One\n\n";
for (unsigned int j = 0; j < vals[i].size(); j++){
cout << vals[i][j] << endl;
}
cout << "End New One\n\n";
}
}
vector<vector<string> > AppManager::fileReader(string fileName) {
string line;
vector<vector<string> > values;
ifstream inputFile(fileName.c_str());
if (inputFile.is_open()) {
while (getline(inputFile,line)) {
std::istringstream iss(line);
std::string val;
vector<string> tmp;
while(std::getline(iss, val, '\t')) {
tmp.push_back(val);
}
values.push_back(tmp);
}
inputFile.close();
}
else {
throw string("Error reading the file '" + fileName + "'");
}
return values;
}
Avez-vous une trace de la pile qui permettrait de montrer où la
Je suis sur un serveur de mon université, je n'ai aucun contrôle dessus. Il est de ruiner Solaris et ma demande est prévu pour fonctionner sur elle. Ensemble de données a été fournie par eux
Comment puis-je obtenir une trace de la pile? Désolé, je suis novice en C++
Pour obtenir une trace de la pile, l'exécution de votre programme sous le débogueur. Lorsque l'exception est levée, le débogueur vous redonner le backtrace. Vous pouvez avoir
bad_alloc
est levée? (D'ailleurs, combien de RAM libre avez-vous?)Je suis sur un serveur de mon université, je n'ai aucun contrôle dessus. Il est de ruiner Solaris et ma demande est prévu pour fonctionner sur elle. Ensemble de données a été fournie par eux
Comment puis-je obtenir une trace de la pile? Désolé, je suis novice en C++
Pour obtenir une trace de la pile, l'exécution de votre programme sous le débogueur. Lorsque l'exception est levée, le débogueur vous redonner le backtrace. Vous pouvez avoir
gdb
sur votre plate-forme Solaris a également dbx
. En règle générale, vous utilisez un débogueur en donnant l'exécutable pour être débogué sur la ligne de commande, puis l'émission de la run
de commande. Hélas, le manuel est votre ami.
OriginalL'auteur Achintha Gunasekara | 2013-10-08
Vous devez vous connecter pour publier un commentaire.
Il n'y a rien de mal avec votre code, vous êtes tout simplement en cours d'exécution sur une plate-forme susceptible à petit les limites de la mémoire, il est probable qu'un vieux compilateur et probablement un ancien de la bibliothèque C++. Tout conspire contre vous. Vous aurez à micro-optimiser 🙁
Voici ce que vous pouvez faire, en commençant par la plus faible fruits mûrs première:
Faire un essai à travers le fichier, il suffit de compter les lignes. Puis
values.resize(numberOfLines)
, de retourner au début et ensuite seulement de lire les valeurs. Bien sûr, vous ne serez pas à l'aide devalues.push_back
plus, simplementvalues[lineNumber] = tmp
. Le redimensionnement de lavalues
vecteur que vous ajoutez à plus que le double de la quantité de mémoire de votre processus de besoins sur une base temporaire.À la fin de la ligne, ne
tmp.resize(tmp.size()
- il va réduire le vecteur de simplement ajuster les données.Vous pouvez réduire les frais généraux dans le code existant par le stockage de toutes les valeurs dans un vecteur.
Si chaque ligne a un nombre différent d'éléments, mais vous accéder séquentiellement plus tard, vous pouvez stocker une chaîne vide en interne comme délimiteur, il ont peut-être moins de frais généraux que le vecteur.
Si chaque ligne a le même nombre de valeurs, puis en les divisant par les lignes ajoute une surcharge inutile - vous connaître l'indice de la première valeur de chaque ligne, c'est tout simplement
lineNumber * valuesPerLine
, où la première ligne de a nombre0
.Carte mémoire le fichier. Magasin de début et de fin de chaque mot dans un élément de structure d'un vecteur, avec peut-être un numéro de la ligne ainsi si vous avez besoin de le diviser en lignes.
OriginalL'auteur Kuba Ober