状況は次のとおりです。14 294 508符号なし整数と13 994 397浮動小数点数を持つファイルがあります(double
を読み込む必要があります)。合計ファイルサイズは〜250 MBです。C++でストリームから高速フォーマットされた入力を実行する方法は?
std::istream
には約30秒かかります。ファイルからメモリへのデータの読み込み(フォーマットされた入力なしでバイトをコピーするだけ)ははるかに高速です。ファイル形式を変更せずに読み込み速度を向上させる方法はありますか?
状況は次のとおりです。14 294 508符号なし整数と13 994 397浮動小数点数を持つファイルがあります(double
を読み込む必要があります)。合計ファイルサイズは〜250 MBです。C++でストリームから高速フォーマットされた入力を実行する方法は?
std::istream
には約30秒かかります。ファイルからメモリへのデータの読み込み(フォーマットされた入力なしでバイトをコピーするだけ)ははるかに高速です。ファイル形式を変更せずに読み込み速度を向上させる方法はありますか?
STLスタイルのI/Oを使用する必要がありますか?あなたは専門家の一人からthis優れた作品をチェックしなければなりません。 Dietmar Kuhlの特化したiostream
です。
私はこれを示唆することは嫌ですが、CフォーマットのI/Oルーチンを見てください。また、一度にファイル全体を読んでいますか?私はそれを使用していない
が、彼はいくつかの非常に印象的な主張をし、私は多くのことを発見しました:
構文とアプローチは関係ありません:)そして、はい、私は全体のファイルを読んでいます。 –
あなたはfscanfと友達を試しましたか?私はこれらのショットを与え、測定を言うと思います。 – dirkgently
また、マシュー・ウィルソンのFastFormatの図書館で見たいと思うかもしれません彼の他の作品は、勉強と使用に価値がある(そして機会に盗む)価値がある。
フォーマットを指定していません。メモリマップを作成したり、大量のチャンクで読み込んだり、バッチアルゴリズムで処理したりする可能性があります。
また、読んでいるファイルとプロセスが同じプラットフォーム上にあることがわかっているかどうかについては言及していません。ビッグエンディアンのプロセスがそれを書き出し、リトルエンディアンのプロセスがそれを読み取った場合、またはその逆の場合、それは成功しませんでした。
自分(atoi関数& atof)によって入力の解析、通常は「ユニバーサル」をお読みの方法に比べ、少なくとも2倍の速度向上させます。
間に合わせの何かがちょうど標準C++文字列にファイルをダンプし、それににstringstreamを使用することです:
#include <sstream>
// Load file into string file_string
std::stringstream s(file_string);
int x; float y;
s >> x >> y;
これはあなたのパフォーマンス改善の多くを与えていないこと(あなたが得ますiostreamを避けることでより高速化することができます)、試してみるのはとても簡単です。
私は、これはあなたがSECURE_SCL(デフォルトではオン)から被るしているどのくらいのペナルティを調査することをお勧めしますMSVCのLIBSのであれば、あなたのループコード – Ben
を投稿するべきだと思います。しかし、それをオフにすることの意味を理解するために注意してください。 – Functastic
申し訳ありませんが、それが必要です:_SECURE_SCL – Functastic