MemoryMappedFile или сериализация, скорость на очень большом объекте

StackOverflow https://stackoverflow.com/questions/9373303

Вопрос

У меня есть проект, в котором есть довольно сложный, вложенный (ссылки, вызывающие указанные объекты вверх и вниз) объект (класс), хранящийся в словаре, например:

родовое слово

Object1 - сложный класс. Это не похоже на класс «адресная книга» или «информация о человеке». В самом классе есть массивы, словари другого объекта. Эти объекты ссылаются на класс над ним и т. Д.

Поскольку размер DObject может быть больше 1 ГБ в памяти, я собираюсь сериализовать его в файл с помощью BinaryFormatter. Поскольку мне нужно загрузить этот объект, я подумал об использовании MemoryMappedFile. В словарь могут быть добавлены новые ключи и значения. В объектах может быть больше данных (добавлено / обновлено) и т. Д. Меняется ли размер MMF? Как мне получить доступ к определенному ключу в объекте DO в файле с отображением памяти? Есть ли в памяти механизм поиска, такой как хеш-таблица, чтобы я мог найти определенный ключ, например словарь, и получить его значение? Как вообще работает этот MMF?

Моя идеальная мысль. У вас есть большой файл на диске (2 ГБ +). Я быстро обновляю объект в словаре на диске, как если бы на диске была сохранена память. Все быстро. Пары "ключ-значение" ищите до конца. Я смотрю вверх, редактирую значение, сохраняю и т. Д. Я должен иметь быстрый доступ к этому объекту размером 2 ГБ в любое время, когда захочу. Если сервер WCF перезапустится, мне понадобится быстрый доступ к этому объекту размером 2 ГБ +. Вот почему я думал 1) сериализация 2). загружать и читать из / в MMF. Сейчас меня больше всего беспокоит скорость. Другими словами, я не могу перезагружать эти 2 ГБ данных с нуля каждый раз, когда отлаживаю проект (это занимает много времени).

Любые предложения, идеи и мысли о том, как мне поступить в этой ситуации.

Это было полезно?

Решение

Невозможно сохранить сам код сгенерированного тега в файле с отображением памяти.Объекты .NET имеют тенденцию все время перемещаться, и вы не можете заставить их оставаться в одном месте в памяти (вы можете закрепить их, но вы действительно не хотите).Вы можете сериализовать объект и записать его в файл, но это будет означать, что каждый раз будет записывать более 1 ГБ данных.

Почему бы не пойти стандартным путем и не «сериализовать» свой объект в набор таблиц базы данных?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top