Самый быстрый способ сделать это - сохранить все в одном файле и переместить курсор на блок, который вы хотите прочитать. Как только вы нажимаете на диск, читая последовательность с этого момента, он довольно быстро.
Несколько попаданий в разные INodes для определения местоположения файла на физическом томе, что занимает большую часть времени, а также что плохо масштабируется.
Кроме того, поскольку это динамично, вам также понадобится карта, которая хранит смещение в файле для каждого чанка.
На диске
[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 вы не захотите использовать блок using, поскольку вам понадобится только 1 поток чтения в течение жизни того уровня, который вы используете. Также вам, вероятно, придется сохранить отображение чанка в другой файл при выходе, но это всего лишь одна загрузка, когда вы загружаете свой уровень.