2009-03-15 6 views
5

状況は次のとおりです。14 294 508符号なし整数と13 994 397浮動小数点数を持つファイルがあります(doubleを読み込む必要があります)。合計ファイルサイズは〜250 MBです。C++でストリームから高速フォーマットされた入力を実行する方法は?

std::istreamには約30秒かかります。ファイルからメモリへのデータの読み込み(フォーマットされた入力なしでバイトをコピーするだけ)ははるかに高速です。ファイル形式を変更せずに読み込み速度を向上させる方法はありますか?

+0

私は、これはあなたがSECURE_SCL(デフォルトではオン)から被るしているどのくらいのペナルティを調査することをお勧めしますMSVCのLIBSのであれば、あなたのループコード – Ben

+0

を投稿するべきだと思います。しかし、それをオフにすることの意味を理解するために注意してください。 – Functastic

+0

申し訳ありませんが、それが必要です:_SECURE_SCL – Functastic

答えて

3

STLスタイルのI/Oを使用する必要がありますか?あなたは専門家の一人からthis優れた作品をチェックしなければなりません。 Dietmar Kuhlの特化したiostreamです。

私はこれを示唆することは嫌ですが、CフォーマットのI/Oルーチンを見てください。また、一度にファイル全体を読んでいますか?私はそれを使用していない

が、彼はいくつかの非常に印象的な主張をし、私は多くのことを発見しました:

+0

構文とアプローチは関係ありません:)そして、はい、私は全体のファイルを読んでいます。 –

+0

あなたはfscanfと友達を試しましたか?私はこれらのショットを与え、測定を言うと思います。 – dirkgently

1

また、マシュー・ウィルソンのFastFormatの図書館で見たいと思うかもしれません彼の他の作品は、勉強と使用に価値がある(そして機会に盗む)価値がある。

+0

書式付き入力をサポートしていますか? –

+0

クラップ - そうです...それは出力フォーマットだけです。 –

+0

多分この技術を入力に適用することができます – dcw

1

フォーマットを指定していません。メモリマップを作成したり、大量のチャンクで読み込んだり、バッチアルゴリズムで処理したりする可能性があります。

また、読んでいるファイルとプロセスが同じプラットフォーム上にあることがわかっているかどうかについては言及していません。ビッグエンディアンのプロセスがそれを書き出し、リトルエンディアンのプロセスがそれを読み取った場合、またはその逆の場合、それは成功しませんでした。

1

自分(atoi関数& atof)によって入力の解析、通常は「ユニバーサル」をお読みの方法に比べ、少なくとも2倍の速度向上させます。

0

間に合わせの何かがちょうど標準C++文字列にファイルをダンプし、それににstringstreamを使用することです:

#include <sstream> 
// Load file into string file_string 
std::stringstream s(file_string); 
int x; float y; 
s >> x >> y; 

これはあなたのパフォーマンス改善の多くを与えていないこと(あなたが得ますiostreamを避けることでより高速化することができます)、試してみるのはとても簡単です。

関連する問題