5

ASCII で格納された大きな浮動小数点ファイルを解析する最良の方法は何ですか?

それを行うための最速の方法は何ですか?ifstream の使用は悪いことだと誰かが私に言ったのを覚えています。なぜなら、それは少数のバイトで機能するからです。最初にファイルをメモリに読み込むだけの方がよいでしょう。本当?

編集: 私は Windows で実行しています。ファイル形式は、xyzrg b のような行に格納されるポイント クラウド用です。それらを配列に読み込もうとしています。また、ファイルはそれぞれ約 20 MB ですが、約 10 GB のファイルがあります。

2 番目の編集: ビジュアライゼーションを実行するたびに表示するファイルをロードする必要があるため、可能な限り高速にするとよいでしょうが、正直なところ、ifstreamプリフォームが合理的であれば、そのまま使用してもかまいません。読み取り可能なコード。現在、実行速度は非常に遅いですが、これはソフトウェアでできることよりもハードウェア I/O の制限である可能性があります。確認したかっただけです。

4

3 に答える 3

4

あなたの最初の関心事は、浮動小数点数の大きさです。それらはフロートですか、それともダブルデータもありますか? 従来の (C) 方法は、fscanf を float の書式指定子とともに使用することであり、かなり高速です。iostream は、データの解析に関してわずかなオーバーヘッドを追加しますが、それは無視できる程度です。簡潔にするために、iostream を使用することをお勧めします (それで得られる通常のストリーム機能は言うまでもありません)。

また、たとえば、解析しようとしているファイルのサイズなど、関連する数値を質問とともに追加していただければ、コミュニティに本当に役立つと思います。これはメモリ フットプリントが小さい環境ですか (組み込みシステムなど)。

于 2010-08-03T22:07:12.613 に答える
1

それはすべて、オペレーティング システムと、C および C++ 標準ライブラリの選択に基づいています。

遅い ifstream の時代は終わりを迎えましたが、C++ ジェネリック インターフェイスの処理に多少のオーバーヘッドが発生する可能性があります。

文字列が既にメモリ内にある場合は、atof/strtod を使用するのが最も速い方法です。

最後に、ファイルをメモリに読み込ませようとしても、おそらく無駄です。最近のオペレーティングシステムは通常邪魔になります(特にファイルがRAMよりも大きい場合、システムは(すでにディスクに保存されている)データをスワップ可能として扱うため、コードをスワップすることになります)。

とてつもなく高速である必要がある場合 (HPC と Map/Reduce ベースのアプローチだけが役立つと考えられます) - mmap (Linux/Unix) または MapViewOfFile を試して、最も賢明な方法で仮想メモリにプリフェッチされたファイルを取得してください。アプローチ、次に atof + カスタム文字列処理。

この種のゲーム用にファイルが非常によく整理されている場合は、mmap とポインターを奇妙に使用して、変換をマルチスレッドにすることもできます。定期的に変換する浮動小数点数が 10 GB を超える場合は、楽しいエクササイズのように思えます。

于 2010-08-03T22:09:27.270 に答える
0

最も速い方法は、おそらく ifstream を使用することですが、fscanf を使用することもできます。特定のプラットフォームを使用している場合は、ファイルをメモリに手動でロードし、そこから float を手動で解析できます。

于 2010-08-03T22:03:07.080 に答える