2010-10-24 3 views
3

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

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

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

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

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

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

+0

Насколько велики отдельные объекты? Действительно ли нужно хранить их все в одном огромном файле? Кажется, что куча меньших объектов упростит вашу жизнь и улучшит производительность (хотя у вас могут быть и другие неустановленные требования ...) –

+0

Ну, проблема в том, что это должно быть общее решение, которое может масштабироваться от нескольких объектов до очень многих ... но сами объекты в целом не такие большие – Homde

ответ

0

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

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

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

+0

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

0

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

+0

Это скорее низкоуровневая библиотека, а не как решение (это * * база данных :). Мне не нужно обрабатывать все объекты сразу, но мне нужно иметь возможность вытаскивать набор объектов по запросу. – Homde

+0

@MattiasK почему вы не используете существующее решение? Создавая свой собственный, у вас будет слишком много сложностей, и ваша производительность, вероятно, будет не такой хорошей. –

+0

Это что-то вроде нишевого решения с некоторыми конкретными потребностями. – Homde

Смежные вопросы