5

私は C++ プログラム (C++ 98) に取り組んでいます。多くの行 (10000 行) を含むテキスト ファイルを読み取ります。これらはタブで区切られた値で、Vector オブジェクトの Vector に解析します。ただし、一部のファイル(小さい)では機能するようですが、ファイルの1つで次のエラーが発生します(このファイルには10000行があり、90MBです)。これはメモリ関連の問題だと思いますか?手伝ってくれませんか?

エラー

terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Abort

コード

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;
}
4

1 に答える 1

7

コードに問題はありません。メモリ制限が小さい可能性が高いプラットフォームで実行しているだけで、古いコンパイラや古い C++ ライブラリの可能性があります。それはすべてあなたに対して陰謀を企てています。マイクロ最適化する必要があります:(

最初に最もぶら下がっている成果から始めて、次のことができます。

  1. 行を数えるだけで、ファイルをドライランします。次にvalues.resize(numberOfLines)、最初にシークしてから値を読み取ります。もちろんvalues.push_back、もう使うことはありませんvalues[lineNumber] = tmp。ベクトルに追加するときにベクトルのサイズを変更valuesすると、プロセスが一時的に必要とするメモリ量が 2 倍以上になる場合があります。

  2. 行の最後で実行しますtmp.resize(tmp.size()- データにちょうど合うようにベクトルを縮小します。

  3. すべての値を 1 つのベクトルに格納することで、既存のコードのオーバーヘッドを削減できます。

    1. 各行に異なる数の要素があり、後でそれらに順次アクセスする場合は、空の文字列を内部区切り文字として格納できます。これは、ベクターよりもオーバーヘッドが少ない可能性があります。

    2. 各行に同じ数の値がある場合、それらを行ごとに分割すると不要なオーバーヘッドが追加されます.各行の最初の値のインデックスはわかっていlineNumber * valuesPerLineます0.

  4. ファイルをメモリマップします。各単語の先頭と末尾をベクトルの構造要素に格納します。行に分割する必要がある場合は、おそらく行番号も一緒に格納します。

于 2013-10-08T02:28:43.477 に答える