質問

ディスク上にファイルを読み取り、書き込む小さなプログラムがあります。最も単純なレベルに分解すると、あるファイルストリームからバイトを読み取り、別のファイルに書き込みます。それは職務を順調に進めますが、それは最速のものではありません。

驚くべき速度でギガバイト以上の読み取り/書き込みを引き裂くことができる他のアプリケーションを見てきました。明らかに、それらは少し.NETアプリよりも金属に近い動作しています。

ディスクへのストリーミングのための最も効率的な.NET APIは何ですか?スピーディなディスクアクセスのために利用可能なwin32 APIはどのようなものですか(およびP/Inving for for for for for for for for for for for for for for for for for for for for for for for for veroing)

役に立ちましたか?

解決

高速ファイルI/Oは、特定のAPI呼び出しを行うことについてではなく、アプリケーションをアーキテクチャ化してI/Oで動作する方法については少なくなります。

たとえば、単一のスレッドですべてのI/O操作を単一のスレッドで実行している場合、

  1. ブロックをメモリに読み取ります
  2. どういうわけかメモリ内のブロックを処理します
  3. ブロックをファイルに書き込みます
  4. 完了するまで繰り返します...

単一のスレッドの処理ループでシステムのI/O帯域幅をボトルネックしています。別の方法ではあるが、より複雑な設計は、アプリケーションをマルチスレッドしてスループットを最大化し、待ち時間を回避することです。これにより、システムはCPUとI/Oコントローラーの両方の帯域幅を同時に活用できます。これの典型的なデザインは、次のようになります。

  1. 1つの(またはそれ以上の)ワーカースレッドはディスクからデータを読み取り、共有入力キューに追加します
  2. 1つの(またはそれ以上の)ワーカースレッドは、共有入力キューからブロックを読み取り、それらを処理し、共有出力キューに追加します
  3. 共有出力キューからブロックされた処理された1つの(またはそれ以上の)ワーカースレッドは、適切な出力ファイルに書き込みます。

これは、正しく設計する簡単なアーキテクチャではなく、メモリ内のロック競合の作成を避けたり、同時のI/O要求でシステムを圧倒するためにかなりの考えを必要とします。また、出力処理の状態がスレッドのコールスタックではなく、入力/出力作業キューで管理されるように、制御メタデータを提供する必要があります。また、マルチスレッドI/Oを使用すると、入力キューにワークが保証された順序で配置されていることを確認できないため、正しい順序で出力を変換して書き込むことを確認する必要があります。それは複雑です - しかし、それは可能であり、それはシリアルアプローチに対するスループットに劇的な違いをもたらす可能性があります。

本当に時間があり、システムからのすべてのオンスのパフォーマンスを絞りたい場合は、使用することもできます I/O完了ポート - 比較的低レベルAPI-スループットを最大化する。

幸運を。

他のヒント

.NETファイルのサポートは十分に速く(ネイティブWin32関数に匹敵します)。パフォーマンスの向上に役立ついくつかのオプション:

  1. 読み取り/書き込みがシーケンシャルである場合は、適切な戦略を適用してキャッシュマネージャーを支援します - 提供する ランダムアクセスまたはシーケンタルン, 、フィルストリームをインスタンス化するとき
  2. 読み取りデータを保存するために大きなメモリバッファーを使用することを検討してください
  3. 多くの小さなファイルをコピーすると、最初に多くのファイルをメモリバッファーに一度に読み取ることができます(2を参照)、次にファイルをディスクに書き込むことができます
  4. ソースと宛先のストリームがさまざまな場所にある場合(つまり、同じハードドライブではなく、ネットワーク上の1つのファイル、ローカルハードドライブなどのもう1つのファイルなど)、非同期パターンを使用してスピードアップできます。 、使用してデータを読み取ります beginread, 、次に、データを使用します beginwrite, 、およびデータの記述中に、beginereadを使用して次のデータブロックを読み取ります。
  5. パフォーマンスでは不十分だと思っている場合(ただし、私のテストからは、内部Windowsコピーよりも等しくあるか、さらに速いです)。 copyfileex Win32関数(ただし、この関数は、ストリームではなくファイルで動作します)。

ディスクI/Oがボトルネックであるかどうかを判断するために、アプリケーションを紹介しましたか?

どのタイプのハードウェアを実行していますか?ハードウェア構成とは何ですか?

.netでは、試すことができます System.IO.File 名前空間。

win32関数の場合、createfile、writefile、readfileシリーズを試すことができます。

例:

http://msdn.microsoft.com/en-us/library/bb540534(vs.85).aspx

これは間違いなく切断されて乾燥していません。テストと測定がすべてです。

BinaryReaderBinaryWriter 適切なバッファサイズは非常に高速です。構造を読んでいる場合、説明されている安全でないアプローチ 記事上で 速く読んで、書くことも似ています。また、I/Oが実際にボトルネックであることを再確認するための提案にも同意します。私はそのような間違いのためにその記事に最初に出会いました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top