1

ランダムなオフセットでデータを読み取りたい 20 GB のファイルがあるため、シーケンシャル読み取りではありません。非同期 IO を使用する予定ですが、この制限に気付きました –

私が言ったように、私の要件は、ランダムなオフセットで読み取ることです。ただし、BeginRead API はファイルへのオフセットを取得せず、読み取り先のバッファーへのオフセットのみを取得します (http://msdn.microsoft.com/en-us/library/zxt5ahzw)。

したがって、私の唯一のオプションは FileStream. Seek を使用することです。ただし、それに関する問題は、非同期IOを使用している場合です

FileStream fs = Foo.txt は両方のスレッドで使用されます

Thread 1                               Thread 2

fs.Seek(offset1)                       
(Thread 1 gets preempted)              
                                       fs.Seek(offset2)        
                                       fs.BeginRead
fs.BeginRead

スレッド 1 がオフセット 1 へのシークの直後にプリエンプトされると、スレッド 1 はオフセット 2 から読み取ることになりますが、これは意図したものではありません。

これは、ロックを使用する必要があるということですか? これは、非同期 IO の目的を無効にします。

4

4 に答える 4

2

これがあなたの状況に当てはまるかどうかはまったく明確ではありませんが、メモリマップされたファイルを見てください。いくつかのアイデアが得られるかもしれません。

于 2012-05-10T23:42:26.400 に答える
1

スレッドが互いに待機しないようにする場合は、これらのアクセスが非同期で発生したとしても、スレッドごとに 1 つの Stream が必要になります。

スレッドがほとんどの時間を他の処理に費やしている場合は、必要に応じてストリームを開き、完了後に閉じることができます。ストリームはネイティブ リソース、ファイル ハンドルをラップするため、何もせずに何百ものストリームを放置するべきではありません。

最後のオプションは、開いているストリームのプールを管理することです。スレッドがファイルから読み取る必要があるときはいつでも、ストリームの 1 つをスレッドに渡します。完了したら、他のスレッドが使用できるように、ストリームをプールに戻す必要があります。もちろん、プールへのアクセスを同期する必要があります

于 2012-05-11T00:39:11.553 に答える
0

読み取りには、共有ファイル アクセス オプションを使用できます。

読み取り/書き込み共有が必要なく、読み取りのみの場合は、FileAccess/FileShare プロパティを減らすことができます。

Using f As FileStream = mTransferFile.Open(FileMode.OpenOrCreate, 
    FileAccess.ReadWrite, FileShare.ReadWrite)
    Dim newPosition As Long = t.ID * mTransferInfo.BlockSize
    f.Position = newPosition

    'Do stuff here. Open another filestream etc.

End Using
于 2012-05-11T01:18:03.517 に答える