質問

3.7 GB のファイルから小さなデータ シーケンスを読み取る必要があります。読む必要がある位置は次のとおりです 隣接していない, ただし、ファイルが最初から最後まで読み取られるように IO を命令することはできます。

ファイルは、キューに入れられた IO を処理/最適化できる iSCSI SAN に保存されます。

問題は、必要なすべてのデータ/位置を一度にワンショットリクエストするにはどうすればよいでしょうか?出来ますか?読み取りが非常に小さい (20 ~ 200 バイト) ため、非同期 IO はオプションではないと思います

現在、コードは次のようになります。

using (var fileStream = new FileStream(dataStorePath, FileMode.Open, FileAccess.Read, FileShare.Read))
{
    for (int i = 0; i < internalIds.Count();i++ )
    {
        fileStream.Position = seekPositions[i].SeekPosition;
        ... = Serializer.DeserializeWithLengthPrefix<...>(fileStream, PrefixStyle.Base128);

    }
    ...
}

読み取りパフォーマンスが標準以下であるため、この I/O を改善する方法を探しています。ヘッドの移動によるシーク時間は合計されているようです。

役に立ちましたか?

解決

あなたは(マイクロソフトのSysinternalsから)パフォーマンスモニタを実行した上でこの?

私は問題が何であるかわからないんだけど、私は推測を取りますよ。あなたはSANから読んでいる場合は、私は、ディスクがフードの下のネットワーク要求につながるアクセスすると思うだろう。最初の読み取りは、求める要求を送信するデータを読み取り、バッファ、およびその後、シリアライザはオブジェクトを構築します。あなたの2番目の要求が送信される時点で、SANディスクが回転し続けているので、あなたは、データが所定の位置にスピンするのを待つ必要があります。

あなたはマルチスレッドを試したことがありますか?私はあなたのセットアップあなたは、順番に処理するいくつかのスレッドをスピンアップする必要があるファイルのセクションのキューは、(彼らはすべてを一度にファイルにアクセスできるようにFileSharing.Read)を、それらが個別にファイルを開いている場合、パフォーマンスに関する好奇心とその後、彼らはキューから作業をつかん始めましょう。出力別のコレクションに結果。出力のための順序が重要ならば、あなたはあなたがそれらをキューに入れられている元の順序で出力をソート。

--- EDIT ---

あなたは READFILESCATTER APIする ? ここpinvoke.netするからP-呼び出し署名です。

他のヒント

ディスクプロキシとしてのシングルのバックグラウンドスレッドを作成します。それにすべての読み取り操作を送信し、それが読み込みをソートしてマージしています。 2つ以上の領域が接近している場合は、それらを含む完全なセクターを読み、データのサブセクションを取ります。非同期でデータを返します。

記録のために:

POSIX 環境では、 readv 関数。POSIX 環境におけるもう 1 つのオプションは、ノンブロッキング IO です。

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