4

私は一連の実験を実行するソフトウェアを持っています (C++)。結果を保存しないと、すべての実験に 1 分強かかります。生成されたデータの総量は 2.5 G バイトに等しく、実験が終了するまでメモリに保存し、後でファイルに書き込むには大きすぎます。したがって、私はそれらをチャンクで書きます。

for(int i = 0; i < chunkSize;i++){
    outfile << results_experiments[i] << endl;
}

where ofstream outfile("データ"); outfile は最後にのみ閉じられます。

ただし、それらを 4700 KB のチャンク (実際には 4700/Chunksize = results_experiments 要素のサイズ) で書き込むと、実験には約 50 倍の時間がかかります (1 時間以上...)。これは受け入れがたいことであり、以前の最適化の試みはばかげているように見えます。特に、これらの実験は、多くの異なるパラメーター設定などを使用して実行する必要があるため.. (少なくとも 100 回、できればそれ以上)

具体的な私の質問は次のとおりです。

  • 書き込むのに理想的なチャンクサイズはどれくらいですか?

  • 現在データを書き込む方法よりも効率的な方法 (または非常に非効率的な方法) はありますか?

基本的に:導入されたファイルIOオーバーヘッドをできるだけ小さくするのを手伝ってください..

結果のファイル(同じサイズ)をコピー(書き込みと読み取り!)するのに1分もかからないので、これをはるかに高速に実行できるはずだと思います..

コードは完全にプラットフォームに依存せず、(非標準の)ライブラリを使用しない必要があります(別のプラットフォーム用に別のバージョンとより複雑なインストール手順を提供できますが、それは面倒です..)合計実験時間を取得することが現実的でない場合5 分以内で、プラットフォーム/ライブラリの依存関係がない (可能性がある) 場合、これらの導入を真剣に検討します。(プラットフォームは Windows ですが、少なくとも Linux への簡単な移植は可能です)

あなたの努力に感謝。

4

3 に答える 3

5

まず、チャンクごとにバッファをフラッシュしないことは良い考えのようです。計算から完全に独立しているため、IO を非同期で実行することも可能です。mmapファイル I/O のパフォーマンスを向上させるためにも使用できます。

于 2012-06-06T16:24:08.207 に答える
0

ofstreamへの書き込み時にendlがバッファをフラッシュするかどうかは、実装に依存します-

ofstreamのバッファサイズを増やしてみることもできます

char *biggerbuffer = new char[512000];

  outfile.rdbuf()->pubsetbuf(biggerbuffer,512000);

pubsetbufの可用性は、iostreamの実装によって異なる場合があります

于 2012-06-06T16:51:19.120 に答える