2

多くの大きなファイルの MD5 チェックサムを計算する必要があります。このコードは非常に単純です。

System.IO.FileStream file = new System.IO.FileStream(strFullPath, FileMode.Open);
fsFile.Seek(1000, SeekOrigin.Begin);    //skip some chars if need be
System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
byte[] arrBtMd5 = md5.ComputeHash(fsFile);

次のいずれかを実行したい場合、問題が発生します。

  • 同じファイルに対していくつかのハッシュ関数を計算します (md5、sha1、crc32 および-what-not)。
  • ファイル全体の MD5 を計算し、いくつかのヘッダー行をスキップして同じファイルの別の MD5 を計算します。

これを1つずつ行うと、同じファイルが複数回読み取られます。ディスク I/O はシステムのボトルネックであるため、私の質問は次のとおりです。

  1. .NET コンパイラ/フレームワークは、同じファイルを複数回読み取り、操作を最適化することを認識できますか? (ヘッダーなしで2番目のmd5計算を追加したとき、影響はそれほど大きくなかったので、それが何かをすると確信しています)。
  2. 複数の「消費者」間で同じ FileStream を共有するには、どのような手法を使用できますか? FileStream を使用してファイルを一度だけスキミングし、並列に機能するハッシュ関数で使用するためにデータを分割したいと思います。
4

2 に答える 2

1

1 .NET コンパイラ/フレームワークは、同じファイルを複数回読み込んだことを認識して操作を最適化できますか? (ヘッダーなしで2番目のmd5計算を追加したとき、影響はそれほど大きくなかったので、それが何かをすると確信しています)。

いいえ。ただし、基盤となる OS (Windows) がファイルをキャッシュおよびバッファリングします。

2 複数の「消費者」間で同じ FileStream を共有するには、どのような手法を使用できますか? FileStream を使用してファイルを一度だけスキミングし、並列に機能するハッシュ関数で使用するためにデータを分割したいと思います。

利用可能な「ストリームスプリッター」はありませんが、それを MemoryStream に読み込んで再利用できます。しかし、それはかなり小さなファイルでしか機能しません。

Windowsに任せて、特別なことは何もしません。

Hasher を並列で実行してみるとよいでしょう。これは、1 つのディスクで並列 I/O が機能するまれな状況です。

于 2013-07-22T09:57:22.947 に答える