Il modo più veloce per farlo è archiviare tutto in un unico file e saltare il cursore sul blocco che si desidera leggere. Una volta che colpisci il disco leggendo una sequenza da quel punto il suo punto è piuttosto veloce.
I molteplici accessi a diversi INode per trovare la posizione del file sul volume fisico è ciò che richiede la maggior parte del tempo e anche ciò che si ridimensiona male.
Inoltre, poiché questo è dinamico, avrai anche bisogno di una mappa che memorizzi l'offset nel file per ogni blocco.
Su disco
[Chunk 1][Chunk 2][Chunk 3][Chunk 4][Chunk 5][Chunk 6][Chunk 7][Chunk 8][Chunk 9]
Visibile
[7][8][9]
[6][1][2]
[5][4][3]
Quindi devi solo aprire un flusso che legge dal file ma non impedisce ad altri flussi / processi di accedervi. Quindi è necessario leggere l'offset corretto per la distanza corretta. Credo che in C # sia il seguito.
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);
}
}
Ora, a causa del fatto che hai aperto lo stream in modalità sola lettura e hai permesso ad altri di leggere / scrivere su di esso, puoi continuare ad aggiungere nuovi blocchi alla fine. Tieni traccia del loro numero di offset e non provare a leggerli prima che siano lì.
PS non vorrai usare il blocco using poiché vorrai solo 1 flusso di lettura per tutta la vita di qualunque livello tu stia usando. Inoltre, probabilmente dovrai salvare la mappatura dei blocchi in un altro file all'uscita ma questo è solo un carico quando carichi il tuo livello.