Итак, сценарий выглядит следующим образом: у меня есть файлы размером 2-3 ГБ с двоичными сериализованными объектами, у меня также есть индексный файл, который содержит идентификатор каждого объекта и их смещение в файле.
Мне нужно написать метод, который с заданным набором идентификаторов десериализует их в память. Производительность - самый важный тест, а разумные требования к памяти - вторым.
Использование MemoryMappedFile кажется правильным решением, однако я немного не уверен, как обрабатывать большой файл. Я не могу создать MemoryMappedViewAccessor для всего файла, так как он такой большой. Могу ли я одновременно открыть несколько MemoryMappedViewAccessor из разных сегментов, не слишком сильно влияя на память, в этом случае какого размера должны быть эти сегменты?
Представления могут храниться в памяти какое-то время, если к данным часто обращаются, а затем удаляются
Возможно, наивным методом было бы заказать выборку объектов по смещению и просто вызвать CreateViewAccessor для каждого смещения с небольшим буфером. Другой вариант - попытаться выяснить наименьшее количество необходимых различных объектов MemoryMappedViewAccessor и их размер ... но я не уверен в накладных расходах при создании CreateViewAccessor и в том, сколько места вы можете безопасно получить за один раз. Я могу провести небольшое тестирование, но если у кого-то есть идея получше ... :)
Я предполагаю, что другим способом было бы разделить большой файл данных на несколько, но я не уверен, что это принесет пользу в этом случае ...