0

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

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

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

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

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

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

+1

для долговременного сохранения, вы можете столкнуться с проблемой с бинарным форматированием (изменение пространства имен, например, приведет к возникновению проблем). Для краткосрочного хранения это может быть хорошо, но будьте осторожны с использованием памяти, я не думаю, что вы можете без проблем сериализовать граф 1Gb с бинарным форматированием в 32-битном процессе. Если вы считаете, что сопоставление с таблицами дает вам проблему с полным сопротивлением, возможно, вы можете рассмотреть базу данных документов, такую ​​как RavenDB, которая отображает весь граф документа в JSON на диске и обрабатывает много проблем для вас? –

+0

Может ли любая из этих баз данных анализировать граф объектов (20 взаимосвязанных классов) с JSON/BSON и сохранять все ссылки между ними, а затем хранить? Как это работает? Моя идеальная мысль заключается в том, что я подаю DObject в RavenDB или MongoDB прямо, и они сериализуют и хранят все? Каковы шаги, если я хочу поместить DObject в RavenDB? Я новичок в MongoDB, но слышал об этом много. – iefpw

+0

Независимо от того, будет ли RavenDB просто проглатывать ваш объект напрямую или нет, зависит от того, как структурирован ваш объект. RavenDB использует JSon.NET, поэтому вы всегда можете начать с попытки сбросить корневой объект с помощью Json.NET и посмотреть, как далеко вы доберетесь. –

ответ

0

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

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

+0

Как мне это сделать? Объект не является простым списком «информация о человеке» или «контактной информации». Сам объект имеет словарь пар ключ-значение. Значение словаря имеет «Списки», и у этих списков, вероятно, есть «Словарь <строка, object2>» в них. Объект ссылается на внешний объект и т. Д. Если бы у меня была простая строка, int, поля в классе, я бы сохранил ее в таблице базы данных.В этом значении есть одно-много соединений. Всего в этом значении этого словаря содержится около 20 классов. – iefpw

+0

Вы можете смоделировать все, что вы упомянули в таблицах базы данных. Вам понадобится около 20 таблиц, если у вас около 20 классов. – zmbq

+0

Хорошо. Я думаю, что это становится дискуссией о сериализации и хранилище баз данных. Я думаю, что это правильное обсуждение. – iefpw