4

私は現在、(潜在的に多数の)ソースから毎秒の頻度で短い文字列を読み取るプログラムを書いています。このデータを別々のファイルに書き込める必要があり、これを行うための最も効率的な方法についてのガイダンスを期待していました。

私の現在の実装はデータをキューに入れ、キューが特定のサイズを超えるとデータをフラッシュします。

より良いアプローチはありますか?C#では、特に効率的なIO構造はありますか?

編集:概して、「合理的な」最大値は最大100のデータソースになると思いますが、最悪の場合は数百になる可能性があります。

4

1 に答える 1

3

最良の答えを得るには、「大」を定義する必要があります。自分のキューは本当に必要ありません。.NETFrameworkのBufferedStreamは非常に効率的です

http://msdn.microsoft.com/en-us/library/3dsccbf4.aspx

http://msdn.microsoft.com/en-us/library/system.io.bufferedstream.write.aspx

「大」がOSで許可されているファイルハンドルの最大数に近づかない場合は、ファイルを開いたままにしておくことができます(書き込み中に他のプロセスがファイルにアクセスする必要がある場合は、必要に応じて共有を設定します)。これにより、各ファイルを1秒に1回開くオーバーヘッドを回避できます。

どのバッファリングアプローチを使用する場合でも、停電やその他のシステム障害が発生した場合に失う準備ができているよりも多くのデータをバッファリングしないようにしてください。

データ損失を受け入れることができない場合は、各文字列を(バッファリングなしで)ファイルにすぐに書き込むことができ、代わりに書き込みキャッシュとバッテリバックアップを備えたディスクコントローラを使用できます。

アップデート

100個のデータソースは、.Netを実行するOSの開いているファイルの最大数をはるかに下回っています。ファイルを開いて、使い終わるまで開いたままにしておくだけで問題ありません。

Windowsのハンドル数の制限に関する興味深い記事については、を参照してください。

http://blogs.technet.com/b/markrussinovich/archive/2009/09/29/3283844.aspx

于 2012-10-04T21:33:18.540 に答える