Самый быстрый способ десериализации объектов из огромного двоичного файла

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

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

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

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

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

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


person Homde    schedule 24.10.2010    source источник
comment
Насколько велики отдельные объекты? Неужели нужно хранить их все в одном огромном файле? Похоже, что набор более мелких объектов упростит вашу жизнь и повысит производительность (хотя у вас могут быть и другие неустановленные требования ...)   -  person Samuel Neff    schedule 24.10.2010
comment
Проблема в том, что это должно быть общее решение, которое может масштабироваться от нескольких объектов до очень многих ... но сами объекты в целом не такие уж большие.   -  person Homde    schedule 24.10.2010


Ответы (2)


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

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

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

person CodesInChaos    schedule 24.10.2010
comment
это может быть и то, и другое, но неплохо было бы упорядочить доступ по смещению, что я знаю благодаря индексному файлу, спасибо! - person Homde; 24.10.2010

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

person Romain Hippeau    schedule 24.10.2010
comment
Это больше похоже на библиотеку низкоуровневого хранения, чем на решение как таковое (это и есть база данных :). Мне не нужно обрабатывать все объекты сразу, но мне нужно иметь возможность извлекать набор объектов по запросу. - person Homde; 24.10.2010
comment
@MattiasK, почему вы не используете существующее решение? Создавая свой собственный, вы получите слишком большую сложность, и ваша производительность, вероятно, будет не такой хорошей. - person Romain Hippeau; 24.10.2010
comment
Это что-то вроде нишевого решения с некоторыми конкретными потребностями. - person Homde; 24.10.2010
comment
@MattiasK - Если вы предоставите более подробную информацию, вы сможете получить дополнительную помощь. - person Romain Hippeau; 24.10.2010
comment
Я ценю помощь, но мне нужно оценить приведенный выше вопрос, по крайней мере, чтобы я мог провести сравнение производительности. - person Homde; 24.10.2010