A maneira mais rápida de fazer isso é armazenar tudo em um arquivo e pular o cursor para o pedaço que você deseja ler. Depois que você bate no disco, lendo uma sequência a partir dele, seu argumento é bem rápido.
As várias ocorrências em diferentes INodes para encontrar a localização do arquivo no volume físico, o que está demorando na maior parte do tempo e também o que é pouco dimensionado.
Além disso, como isso é dinâmico, você também precisará de um mapa que armazene o deslocamento no arquivo para cada bloco.
No disco
[Chunk 1][Chunk 2][Chunk 3][Chunk 4][Chunk 5][Chunk 6][Chunk 7][Chunk 8][Chunk 9]
Visível
[7][8][9]
[6][1][2]
[5][4][3]
Depois, basta abrir um fluxo que lê o arquivo, mas não impede que outros fluxos / processos o acessem. Então você precisa ler o deslocamento correto para a distância correta. Eu acredito em c # é o abaixo.
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);
}
}
Agora, devido ao fato de você ter aberto o fluxo no modo somente leitura e permitir que outras pessoas leiam / gravem, você pode continuar adicionando novos pedaços ao final. Basta acompanhar o número de deslocamento e não tentar lê-los antes que eles estejam lá.
PS: você não desejará usar o bloco using, pois desejará apenas 1 fluxo de leitura ao longo da vida do nível em que estiver usando. Além disso, você provavelmente precisará salvar o mapeamento de partes em outro arquivo na saída, mas isso é apenas uma carga quando você carrega seu nível.