Der schnellste Weg, dies zu tun, besteht darin, alles in einer Datei zu speichern und den Cursor auf den Block zu bewegen, den Sie lesen möchten. Sobald Sie auf die Festplatte drücken und eine Sequenz von dieser lesen, ist sein Punkt ziemlich schnell.
Die mehrfachen Treffer auf verschiedene INodes, um den Speicherort der Datei auf dem physischen Volume zu finden, nehmen die meiste Zeit in Anspruch und auch die Skalierung ist schlecht.
Da dies dynamisch ist, benötigen Sie auch eine Karte, in der der Versatz in der Datei für jeden Block gespeichert ist.
Auf der Festplatte
[Chunk 1][Chunk 2][Chunk 3][Chunk 4][Chunk 5][Chunk 6][Chunk 7][Chunk 8][Chunk 9]
Sichtbar
[7][8][9]
[6][1][2]
[5][4][3]
Dann müssen Sie nur noch einen Stream öffnen, der aus der Datei liest, andere Streams / Prozesse jedoch nicht daran hindert, darauf zuzugreifen. Dann müssen Sie aus dem richtigen Versatz für den richtigen Abstand lesen. Ich glaube an C #, es ist das Folgende.
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);
}
}
Aufgrund der Tatsache, dass Sie den Stream im schreibgeschützten Modus geöffnet haben und anderen das Lesen / Schreiben erlauben, können Sie am Ende immer wieder neue Blöcke hinzufügen. Behalten Sie einfach ihre Versatznummer im Auge und versuchen Sie nicht, sie zu lesen, bevor sie dort sind.
PS: Sie möchten den using-Block nicht verwenden, da Sie nur einen Lesestream über die gesamte Lebensdauer des von Ihnen verwendeten Levels benötigen. Außerdem müssen Sie wahrscheinlich die Chunk-Zuordnung beim Beenden in einer anderen Datei speichern, aber das ist nur eine Ladung, wenn Sie Ihr Level laden.