2

私はCSVファイルから読み込んで解析し、データを保存しています。非常に簡単です。

現在、それを行うために標準的なreadLine()方法を使用しており、私はこの処理ループからいくつかの余分な効率を絞り出そうとしています。それらが舞台裏にどれだけ隠れているかはわかりませんが、への各呼び出しgetLineは、それに伴うすべての苦痛を伴う新しいOS呼び出しであると思いますか?入力の各行でOS呼び出しの料金を払いたくありません。巨大なバッファを提供し、一度に多くの行でバッファを埋めるようにします。

しかし、私はフルラインだけを気にします。1つのバッファ読み取りからの部分的な行を維持して、2番目のバッファ読み取りに追加して完全な行を作成する必要はありません。これは、醜くて煩わしいことです。

それで、私のためにこれを行う方法はありますか?ほとんどあるはずのようです。x行数またはxバイトで読み取るように指示できるが、最後の部分行を出力しないメソッド、またはメモリバッファーを管理するための簡単な方法でさえ、部分文字列を処理するためのコードの量を最小限に抑えますいただければ幸いです。Boostを使用することもできますが、標準のC ++にメソッドがある場合は、それを使用したいと思います。

ありがとう。

4

2 に答える 2

2

組み込みのC++ストリームよりも優れたパフォーマンスを発揮できる可能性はほとんどありません。彼らはかなり速いです。一般に、ファイルを完全に読み取る最も速い方法は、特にファイルがディスク上で連続している場合、単一のスレッドを使用してファイル全体を最初から最後まで読み取ることです。さらに、読み取り中のディスクはOSよりもはるかにボトルネックになっている可能性があります。アプリのパフォーマンスを向上させる必要がある場合は、いくつかの推奨事項があります。

  • プロファイラーを使用します。アプリが行を読み取ってからそれを解析または何らかの方法で処理している場合、解析または処理は最適化できるものである可能性があります。これは、プロファイリングで決定できます。解析または処理がかなりのCPUリソースを消費する場合、最適化は努力する価値があるかもしれません。
  • 解析または処理がアプリケーションの速度低下の原因であり、簡単に最適化できないと判断した場合は、マルチプログラミングを検討してください。個々の行の処理が前の行の処理結果に依存しない場合は、複数のスレッドまたはCPUを使用して処理を実行します。
  • 複数のファイルを処理する必要がある場合は、パイプラインを使用してください。たとえば、アプリに読み取り、解析、処理、保存の4つの段階があるとします。すべてを一度に読み取るよりも、一度に1つのファイルを読み取る方が効率的な場合があります。ただし、2番目のファイルを読み取っている間も、最初のファイルを解析できます。3番目のファイルを読み取っているときに、2番目のファイルを解析して、最初のファイルを処理することができます。これを実装する1つの方法は、段階的なマルチスレッドアプリケーションの設計です。
  • RAIDを使用して、ディスクの読み取りを改善します。特定のRAIDモードでは、読み取りと書き込みを高速化できます。
于 2012-06-15T22:55:43.343 に答える
0

私はJavaプログラマーですが、それでもヒントがあります...ストリーム内のデータを読み取ります。つまり、たとえば2048バイトの4倍または5倍(またはそれ以上)...ストリームを反復処理(および変換)して、行末(またはその他の文字)を検索できます...しかし、「readLine」だと思いますとにかく同じことをしています...

于 2012-06-15T22:47:27.970 に答える