3

現在、さまざまな種類のファイル (txt、バイナリ、オフィスなど) を扱っています。通常、byte[]orstringを使用してファイル データをメモリに保持し (書き込み/解析中)、ファイルに読み書きするためFileStreamに、データが完全に処理された後に、を使用してデータ全体を書き込みます。

  • テキスト ファイルのデータを生成TextStreamするときに、の代わりにを使用する必要がありますか?string
  • バイナリ ファイルのデータを生成FileStreamするときに、の代わりにを使用する必要がありますか?byte[]
  • ストリームを使用すると、データ全体を計算して最後に一度に出力するよりもパフォーマンスが向上しますか?
  • ファイル I/O が常にストリームを使用する必要があるというのは一般的なルールですか、それとも場合によっては私のアプローチで問題ありませんか?
4

3 に答える 3

4

バイト[]/文字列とストリームの利点は、バイト[]/文字列がメモリ内にあり、アクセスが高速になる可能性があることです。ただし、ファイルが非常に大きい場合は、ページングが発生してパフォーマンスが低下する可能性があります。byte[]/string アプローチのもう 1 つの利点は、解析が少し簡単になる可能性があることです (単純に File.ReadAllText を使用するなど)。

解析が許可されている場合 (特にランダムにシークする必要がない場合)、特にファイルがかなり大きい場合は、FileStream を使用する方が効率的です。また、C# (4.5) の async/await 機能を利用して、非常に簡単にファイルを非同期で読み書きし、読み込んだチャンクを処理することもできます。

個人的には、パフォーマンスについてあまり心配していない場合、またはファイルが非常に小さい場合は、おそらくファイルをメモリに読み込むだけです。それ以外の場合は、ストリームの使用を検討します。

最終的には、パフォーマンスの違いが気になる場合は、いくつかの簡単なテスト プログラムを作成し、それぞれのパフォーマンスの時間を計ってください。そうすれば、最良の答えが得られるはずです。

于 2012-10-19T07:57:05.967 に答える
1

データのサイズについて話すこととは別に、もう 1 つの重要な問題はデータの目的です。文字列や配列を操作する場合、操作はより簡単に実行できます。文字列と配列の両方が同じように便利な場合は、バイトの配列が優先されます。文字列を解釈する必要があるため、複雑さが増し (エンコーディング、BOM など)、バグの可能性が高くなります。文字列はテキストにのみ使用してください。バイナリ データは、常にバイト配列またはストリームで処理する必要があります。

ストリームは、操作を実行する必要がないか、対象のデータが非常に大きいか、対象のデータの受信が非常に遅い場合に毎回考慮する必要があります。ストリームは、部分ごとにデータを処理する自然な方法ですが、文字列や配列は一般に、処理する前にデータ全体がそこにあることを期待しています。

ストリームで作業すると、一般にパフォーマンスが向上します。これは、異なるチャネルで読み取りと書き込みの両方を非同期に行う可能性があるためです。

于 2012-10-19T08:50:06.427 に答える
1

テキストファイルのデータ生成中

ファイル データのフラッシュがすぐに行われる場合はStreamWriterFileStream. そうでない場合は、StringBuilder.

バイナリファイルのデータを生成中ですか?

MemoryStream選択です。さらに、BinaryWritermemstream 経由が推奨されます。

于 2012-10-19T09:43:53.463 に答える