Самый быстрый способ десериализации объектов из огромного двоичного файла - PullRequest
3 голосов
/ 24 октября 2010

Таким образом, сценарий таков: у меня есть файлы размером 2-3 ГБ с двоичными сериализованными объектами, у меня также есть индексный файл, который содержит идентификатор каждого объекта и их смещение в файле.

Мне нужно написать метод, который с помощью набора идентификаторов десериализует их в память.Производительность - это самый важный критерий, а сохранение разумных требований к памяти - второе.

Использование MemoryMappedFile кажется правильным, однако я немного не уверен в том, как обращаться с большим файлом.Я не могу создать MemoryMappedViewAccessor для всего файла, так как он очень большой.Могу ли я одновременно открыть несколько MemoryMappedViewAccessor из разных сегментов, не оказывая слишком большого влияния на память, в таком случае, насколько большими должны быть эти сегменты?

Представления могут некоторое время сохраняться в памяти, если к данным обращаются много, а затем удаляютиз

Возможно, наивным методом было бы упорядочить объекты, выбираемые по смещению, и просто вызвать CreateViewAccessor для каждого смещения с небольшим буфером.Другой вариант - попытаться выяснить наименьшее количество различных необходимых MemoryMappedViewAccessor и их размер ... но я не уверен в затратах на создание CreateViewAccessor и в том, сколько места вы можете безопасно получить за один раз.Я могу провести некоторое тестирование, но если у кого-то есть идея получше ...:)

Думаю, можно пойти другим путем, разделив большой файл данных на несколько, но я не уверен, что это принесет пользуслучай ...

Ответы [ 2 ]

0 голосов
/ 24 октября 2010

Мой вопрос к вам: почему у вас есть 2 3GB файла сериализованных объектов?При загрузке это всегда будет проблемой производительности.
Вам действительно нужно обрабатывать всю эту информацию сразу?Наилучшим подходом может быть какая-то база данных, которую вы будете использовать для запроса элементов, которые вам нужны, при необходимости и перестройки их на этом этапе.Можете ли вы предоставить больше информации о том, какие данные вы храните и как вы их используете.Мне кажется, что ваш дизайн нуждается в небольшой работе.

0 голосов
/ 24 октября 2010

На каком хранилище находится файл? Нормальный HDD или SSD? В случае обычного жесткого диска вы должны минимизировать время поиска, поэтому вам может потребоваться упорядочить свои обращения по смещению.

Я думаю, что наличие больших сегментов с отображенной памятью не требует больших затрат оперативной памяти. Они только стоят адресного пространства, так как они могут быть поддержаны самим файлом. Таким образом, большая часть используемой оперативной памяти - это кэш ОС.

Из того, что я слышал, асинхронный ввод-вывод с использованием портов завершения ввода / вывода самый быстрый, но я сам еще не использовал их.

...