0

コードは、組み込みLinuxでまだ処理されていないファイルを見つけて処理する必要があります。getDirは、ディレクトリのソートされた内容を返すために使用されます。以下のコードは、数十または100を超えるファイルを処理した後は完全に機能しますが、その後oom-killerで停止します。これは、C ++ベクトル(ループベクトル内のループベクトル)を使用するための悪い方法ですか?この方法は、oom-killerを引き起こしている可能性がありますか?爆破せずに機能する可能性のある別のアプローチはありますか?スコープ外になると、各ベクトルを破棄するべきではありませんか?代わりに新規/削除を使用する必要がありますか?また、メモリリークを検出するためのvalgrindは、このプロセッサ(TI DM368)のSDKに統合されていませんが、コードは非常に短く、新しいステートメントはありません。ノート:実際のコードは、SQLデータベースで既に処理されたファイルをチェックしますが、このコードは、SQLコードがコメント化された状態で、依然としてoom-killerを引き起こしているため、簡単にするために省略されています。ファイルパスの形式は/YYYYmmdd/HH/MMSS.SS.extです。

void getDir (string dir, vector<string> &files) {
    ...
    while ((dirp = readdir(dp)) != NULL) {
        files.push_back(string(dirp->d_name));
    closedir(dp);
    sort(files.begin(), files.end());

while (true) {
    vector<string> days;
    getDir(database_location, days);
    for (uint d=0; d<days.size(); d++) {
        vector<string> hours;
        getDir(database_location+days[d], hours);
        for (uint h=0; h<hours.size(); h++) {
            vector<string> files;
            string dir = database_location+days[d]+"/"+hours[h];
            getDir(dir, files);
            for (uint f=0; f<files.size(); f++) process(dir, files[f]);
4

2 に答える 2

2
  1. LinuxOOMキラーは悪名高い馬鹿げています。デフォルトでは、自分のコードを非難し始めないでください。
  2. 妥当なサイズのベクトルは3つしかありません。(ベクトルサイズが不合理である場合、それは単一のディレクトリ内のファイルの数も不合理であるためです)。
  3. 必要ありませんnew/delete

マルチスレッドを実行する予定はないので、3つのベクトルを作成することを検討してstaticください。ハックしますが、うまくいくかもしれません。

于 2013-02-04T16:42:00.053 に答える
0

メモリを節約するために、各文字列またはベクトルが最終的なサイズになったら、 string ::shrink_to_fit()およびvector::shrink_to_fitを使用してみてください(もちろん、それ以前ではありません)。

もう1つのことは、最初にベクターに集まらないでください。それがhours非常に長いベクターである場合は、代わりに、各ディレクトリエントリを読みながら処理し、後ですべてを何らかの方法で並べ替えます。

于 2013-02-04T16:50:20.717 に答える