私のシステムRAMは小さく、1.5GBです。特定のメソッドを約300回呼び出すC++プログラムがあります。このメソッドは2つのマップを使用し(それらは毎回クリアされます)、このメソッドの呼び出しの一部でスタックがオーバーフローしてプログラムが失敗する可能性があるかどうかを知りたいです。小さなデータを入れると(メソッドが30回呼び出されるように)、プログラムは正常に実行されます。しかし、今ではSIGSEGVエラーが発生します。私はこれを約3日間修正しようとしていますが、運が悪かったので、試したすべての解決策が失敗しました。
以下でSIGSEGVの原因をいくつか見つけましたが、何も 役に立ちませんでした。C++でのSIGSEGVランタイムエラーとは何ですか。
わかりました、ここにコードがあります。いくつかのキーワードを含む2つのインスタンスがあります-機能とそのスコア
彼らのユークレディアン距離を取得したいのですが、これは、各インスタンスのすべてのキーワードを保存してから、最初のキーワードと2番目のキーワードのdiffを見つけてから、残りの2番目のキーワードのdiffを見つける必要があることを意味します。実例。私が欲しいのは、最初のマップを繰り返しながら、2番目のマップから要素を削除できるようにすることです。次のメソッドは、2つのメッセージコレクションがあるため複数回呼び出され、最初のメソッドのすべてのメッセージが2番目のメッセージのすべてのメッセージと比較されます。
私はこのコードを持っていますが、いくつかの場所に置いた複数のcoutで数秒間動作していることを確認しましたが、突然停止します
これは大学のタスクのためのものであるため、ブーストとそれらすべてのトリックを使用することはできません。しかし、私は自分が抱えている問題を回避する方法を知りたいと思います。
float KNNClassifier::distance(const Instance& inst1, const Instance& inst2) {
map<string,unsigned> feat1;
map<string,unsigned> feat2;
for (unsigned i=0; i<inst1.getNumberOfFeatures(); i++) {
feat1[inst1.getFeature(i)]=i;
}
for (unsigned i=0; i<inst2.getNumberOfFeatures(); i++) {
feat2[inst2.getFeature(i)]=i;
}
float dist=0;
map<string,unsigned>::iterator it;
for (it=feat1.begin(); it!=feat1.end(); it++) {
if (feat2.find(it->first)!=feat2.end()) {//if and only if it exists in inst2
dist+=pow( (double) inst1.getScore(it->second) - inst2.getScore(feat2[it->first]) , 2.0);
feat2.erase(it->first);
}
else {
dist+=pow( (double) inst1.getScore(it->second) , 2.0);
}
}
for (it=feat2.begin(); it!=feat2.end(); it++) {//for the remaining words
dist+=pow( (double) inst2.getScore(it->second) , 2.0);
}
feat1.clear(); feat2.clear(); //ka8arizoume ta map gia thn epomenh xrhsh
return sqrt(dist);
}
また、何かを削除する必要がないようにこのアイデアを試しましたが、突然停止します。
float KNNClassifier::distance(const Instance& inst1, const Instance& inst2) {
map<string,unsigned> feat1;
map<string,unsigned> feat2;
map<string,bool> exists;
for (unsigned i=0; i<inst1.getNumberOfFeatures(); i++) {
feat1[inst1.getFeature(i)]=i;
}
for (unsigned i=0; i<inst2.getNumberOfFeatures(); i++) {
feat2[inst2.getFeature(i)]=i;
exists[inst2.getFeature(i)]=false;
if (feat1.find(inst2.getFeature(i))!=feat1.end()) {
exists[inst2.getFeature(i)]=true;
}
}
float dist=0;
map<string,unsigned>::iterator it;
for (it=feat1.begin(); it!=feat1.end(); it++) {
if (feat2.find(it->first)!=feat2.end()) {
dist+=pow( (double) inst1.getScore(it->second) - inst2.getScore(feat2[it->first]) , 2.0);
}
else {
dist+=pow( (double) inst1.getScore(it->second) , 2.0);
}
}
for (it=feat2.begin(); it!=feat2.end(); it++) {
if(it->second==false){//if it is true, it means the diff was done in the previous iteration
dist+=pow( (double) inst2.getScore(it->second) , 2.0);
}
}
feat1.clear(); feat2.clear(); exists.clear();
return sqrt(dist);
}