MemoryMappedFile или сериализация, скорость на очень большом объекте - PullRequest
0 голосов
/ 21 февраля 2012

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

public static Dictionary<string, Object1> DObject { get; set; }

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

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

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

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

1 Ответ

0 голосов
/ 21 февраля 2012

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

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

...