1

したがって、ファイルへの最大 1000 のパスを受け取るプログラムがあり、特定の 3 バイトを読み取って日付を返すというアイデアはすべて問題ありません。

問題は開始時に始まり、メモリ使用量が最大に向かって飛び、数秒以内にPCがフリーズします。

オープニングプロセスで数メガか何かを使い果たしていると思います...この大量のメモリを使用せずに必要なものを達成する方法についてのアイデアはありますか?

注:15 GBのラインに沿って何かとして開いているファイル

int main(int argc, char *argv[])
{
    string paths[1000] = {};
    int date[3] = {0};

    cout << "Arg count: " << argc << endl;
    if (argc <= 1)
        paths[0] = "PRIV.EDB";
    else
        for(int i = 1;i<argc;i++){
            paths[i-1] = argv[i];
        }

    cout << "Start\n\n";
    for (int i=0;i<1000;i++)
    {
        if (paths[i].empty())
            break;
        cout << paths[i] << endl;
        ifstream pFile;
        pFile.open(paths[i], ios::binary);
        pFile.seekg(195);
        date[0] = pFile.get();
        date[1] = pFile.get();
        date[2] = pFile.get();
        cout << date[0] << " : " << date[1] << " : " << date[2] << " \n";
        cout << endl;
        pFile.clear();
        pFile.close();
    }
    cout << "Fin\n";

    if (argc <= 1)
        getchar();

    return date[0];
}
4

1 に答える 1

2

パフォーマンスを向上させるには、メモリ マップト ファイルを使用します。

http://msdn.microsoft.com/en-us/library/dd997372.aspx

MSDN:

これらのメモリ マップト ファイルは、非常に大きなソース ファイルの操作に適しています。

ウィキペディア:

ファイルをメモリ マッピングする主な利点は、I/O パフォーマンスが向上することです。特に、大きなファイルで使用する場合に顕著です。メモリ マップド ファイルへのアクセスは、2 つの理由から、直接の読み取りおよび書き込み操作を使用するよりも高速です。まず、システム コールは、プログラムのローカル メモリへの単純な変更よりも桁違いに遅くなります。次に、ほとんどのオペレーティング システムでは、実際にマップされるメモリ領域はカーネルのページ キャッシュ (ファイル キャッシュ) です。つまり、ユーザー空間にコピーを作成する必要はありません。

簡単な実装については、 http ://www.boost.org/doc/libs/1_54_0/doc/html/interprocess.html を参照してください。

使用する:

ブースト/プロセス間/file_mapping

ブースト/プロセス間/mapped_region

于 2013-09-02T12:23:14.340 に答える