2011-01-24 87 views
1


私はアプリケーションを持っています。これは初期化時にグラフを作成し、そのグラフ上で最短パスの全ペアを実行し、後で結果を使用します。ファイルへの読み書きの高速読み込みと書き込み

グラフがかなり大きいので、これは10-12分ほどの時間がかかります。作成するグラフは毎回同じですので、一度計算して後で再利用することができます。

しかし、これは、メモリへの配列を読み込むのにかかる時間が少なくあり、配列は、できるだけ多く35Mなどの要素を持つことができる場合にのみ、(、1バイトごと35M)。理にかなって

は、いくつかの高速な方法はありますこれを達成できるようにデータをダンピング/読み取りすること。

ありがとうございました

+1

HDDの標準速度は60-100Mb/sです。 – ruslik

答えて

2

利用可能なオプションの数は、オペレーティングシステムによって異なります。仮想メモリシステムでは、通常、メモリスペースの一部をファイルにマップし、必要に応じてページを自動的に前後に転送する方法があります。

ファイルシステムを搭載したほとんどのオペレーティングシステムでは、ファイルバッファを増やすと、ファイルの読み取りと書き込みのパフォーマンスが大幅に向上します。デフォルトでは、C++およびCランタイムライブラリは約512または1024バイトのバッファを使用します。アプリケーションのバッファーを1〜40 MBのどこかに増やしてください。

パフォーマンスを向上させるもう1つの手段は、データ構造を再考することです。たぶんそれは小さくでき、そして/または参照のより良い場所を持つことができます。お互いに近いアイテムは、すでにバッファリングまたはキャッシュされている可能性が高くなります。

実際にファイルをすべて書き込む必要はありますか?

+0

だから、あなたはそれをハードコード化するのですか? – sud03r

+0

@ Neeraj:あなたが何を意味するか分かりません。バッファサイズは、[setvbuf()] [http://en.wikipedia.org/wiki/Setbuf#setbuf]と[setbuf()] [http://www.cplusplus.com/reference/iostream/filebuf/setbuf /]を実行します。 – wallyk

+0

私は実際にあなたの質問に答えていました。「実際にファイルをすべて書く必要はありますか? – sud03r

0

ある時点では、ハードドライブの上限速度に達します。

最も簡単な最適化は、読んでいるハードウェアを改善することです。 1つの選択肢はsolid-state driveです。または、データを読むことができるRAM diskを作成することもできます。どちらも、プログラミング言語とは無関係に、あまりにも多くの労力を要することなく、速度を大幅に向上させるはずです。

0

はい、メモリマップファイルです。あなたは、移植性のためにboost :: mapped_fileを使うことができます。

0

これを実行しているコンピュータが変更されない、または移植性が必要ない場合は、深度の最初のトラバーサルを行い、各ノードをバイナリファイルに書き込むことができます。

fwrite(currNode, sizeof(Node), 1, out); 

読書は、あなたがより自動化ソリューションのためのブーストシリアル化を使用しての中に見ることができる反対

Node theNode; fread(&theNode, sizeof(node), 1, in); 

だろう。私は決してそれを使用したことはありません、それを渡すことで言及してください

グラフは常に同じであるため、あなたのプログラムにハードコードすることができます。

最も野心的な解決策は、テンプレートメタプログラミング技術を使用してグラフを書き直すことです。これにより、コンパイル時に地図を変更することができます。コンパイラに大きな負担をかけることになりますが、メモリ内のグラフをランタイムにすることになります。

関連する問題