La forma más rápida de hacer esto es almacenar todo en un archivo y saltar el cursor al fragmento que desea leer. Una vez que golpeas el disco leyendo una secuencia, su punto es bastante rápido.
Los múltiples accesos a diferentes INodes para encontrar la ubicación del archivo en el volumen físico es lo que toma la mayor parte del tiempo y también lo que escala mal.
Además, dado que esto es dinámico, también necesitará un mapa que almacene el desplazamiento en el archivo para cada fragmento.
En el disco
[Chunk 1][Chunk 2][Chunk 3][Chunk 4][Chunk 5][Chunk 6][Chunk 7][Chunk 8][Chunk 9]
Visible
[7][8][9]
[6][1][2]
[5][4][3]
Luego, solo necesita abrir una secuencia que lea el archivo pero no bloquee el acceso de otras secuencias / procesos. Entonces necesita leer desde el desplazamiento correcto para la distancia correcta. Creo en C # es el siguiente.
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);
}
}
Ahora, debido al hecho de que abrió la secuencia en modo de solo lectura y permitió que otros lean / escriban, puede seguir agregando nuevos fragmentos al final. Simplemente haga un seguimiento de su número de desplazamiento y no intente leerlos antes de que estén allí.
PD: no va a querer usar el bloque de uso, ya que va a querer solo 1 flujo de lectura a lo largo de la vida de cualquier nivel que esté usando. También es probable que tenga que guardar la asignación de fragmentos en otro archivo al salir, pero eso es solo una carga cuando carga su nivel.