6

行数の多い大きなテキスト ファイルを読み取り、何らかの処理を行って、それらを新しいファイルに書き込むための最速の方法を特定しようとしています。C#/.net では、StreamReader はこれを行うための一見簡単な方法のようですが、このファイルを使用しようとすると (1 行ずつ読み取る)、Python の I/O の約 1/3 の速度になります (これは心配です)。 Python 2.6 の IO が比較的遅かったとよく耳にします)。

これに対するより高速な .Net ソリューションがない場合、StreamReader よりも高速なソリューションを作成することは可能でしょうか?それとも、私が打ち負かすことを望んでいない複雑なバッファー/アルゴリズム/最適化を既に使用していますか?

4

7 に答える 7

3

あなたが何をしているか、またはあなたが読んでいるファイルのフォーマットのコードサンプルはありますか?

もう 1 つの良い質問は、一度にどれだけのストリームをメモリに保持しているのかということです。

于 2009-01-05T23:35:04.860 に答える
2

独自のコードが一度に 1 文字ずつ検査している場合、センチネルを使用してバッファーの末尾またはファイルの末尾をマークし、内側のループでテストを 1 つだけにする必要があります。あなたのケースでは、1 つのテストが行​​末になるため、たとえば、各バッファの最後に一時的に改行を貼り付けたいと思うでしょう。

センチネルに関するウィキペディアの記事はまったく役に立ちません。このケースについては説明していません。Robert Sedgewick のアルゴリズムの教科書のいずれかで説明を見つけることができます。

また、テキスト データをスキャンするための非常に高速なコードを生成re2cできるも参照してください。それは C コードを生成しますが、それを適応させることができるかもしれません。re2c

于 2009-01-06T02:48:41.363 に答える
2

StreamReader は非常に優れています。Python でどのように読みましたか? より単純なエンコーディング (ASCII など) を指定すると、速度が向上する可能性があります。プロセスが使用している CPU の量は?

適切な StreamReader コンストラクターを使用してバッファー サイズを増やすことができますが、どの程度の違いが生じる可能性があるかはわかりません。

于 2009-01-05T23:33:14.190 に答える
0

StreamReader/FileStream で使用される既定のバッファー サイズは、データのレコード長に対して最適ではない可能性があるため、微調整してみてください。コンストラクターのデフォルトのバッファー長を FileStream とそれをラップする StreamReader の両方にオーバーライドできます。おそらく同じサイズにする必要があります。

于 2009-01-06T01:22:15.423 に答える
0

私が .NET の第一人者ではない場合は申し訳ありませんが、C/C++ では、大きなバッファーがあれば、LL1 パーサーを使用して解析できるはずです。バイトをスキャンするよりもそれほど遅くはありません。ご希望があれば詳しくお伝えできます。

于 2009-01-05T23:46:52.417 に答える
0

処理を高速化するには、BufferedReader と BufferedWriter を試してください。

于 2009-01-05T23:53:37.677 に答える
0

一般的な注意:

  1. 高性能ストリーミングは複雑ではありません。通常、ストリーミング データを使用するロジックを変更する必要があります。それは複雑です。

実際、それだけです。

于 2009-01-05T23:39:24.303 に答える