これを行う最も速い方法は、すべてを1つのファイルに格納し、読み取りたいチャンクにカーソルをジャンプすることです。ディスクを叩くと、それからシーケンスを読み取り、彼のポイントはかなり高速です。
物理ボリューム上のファイルの場所を見つけるためのさまざまなINodeへの複数のヒットは、ほとんどの時間を要し、スケーリングも不十分です。
また、これは動的であるため、各チャンクのオフセットをファイルに保存するマップも必要になります。
ディスク上
[Chunk 1][Chunk 2][Chunk 3][Chunk 4][Chunk 5][Chunk 6][Chunk 7][Chunk 8][Chunk 9]
目に見える
[7][8][9]
[6][1][2]
[5][4][3]
次に、ファイルから読み取るストリームを開く必要がありますが、他のストリーム/プロセスがアクセスできないようにロックしません。次に、正しい距離の正しいオフセットから読み取る必要があります。私はC#を信じています、それは以下です。
var chunk = new byte[4194304];
using (var file = new FileStream (openFileDialog1.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (var reader = new StreamReader (file, Encoding.Unicode)) {
reader.Read(chunk, offset * 4194304, 4194304);
}
}
ストリームを読み取り専用モードで開き、他のユーザーに読み取り/書き込みを許可したため、最後に新しいチャンクを追加し続けることができます。それらのオフセット番号を追跡し、それらが存在する前にそれらを読み取ろうとしないでください。
PSは、使用しているレベルのライフを通じて1つの読み取りストリームのみを必要とするため、usingブロックを使用する必要はありません。また、終了時にチャンクマッピングを別のファイルに保存する必要があるかもしれませんが、これはレベルをロードするときの1回のロードにすぎません。