Как обработать исключение System.OutOfMemoryException при использовании protobuf-net? - PullRequest
0 голосов
/ 05 октября 2018

Я использую protobuf-net в приложении ac # для загрузки и сохранения «файлов проекта» моей программы.При сохранении времени программа создает объект ProjectData и добавляет к нему множество различных объектов - см. Общий принцип ниже.

static ProjectData packProjectData()
{
    ProjectData projectData = new ProjectData();

    projectData.projectName = ProjectHandler.projectName;

    foreach (KeyValuePair<int, Module> kvp in DataHandler.modulesDict)
    {
        projectData.modules.Add(serializeModule(kvp.Value));
    }

    return projectData;
} 

[ProtoContract]
public class ProjectData
{
    [ProtoMember(1)]
    public List<SEModule> modules = new List<SEModule>();

    [ProtoMember(2)]
    public string projectName = "";
}

После создания он архивируется и сохраняется на диск.Проблема, с которой я сталкиваюсь, заключается в том, что, когда число модулей становится очень большим (более 40 000), System.OutOfMemoryException сообщается во время функции packProjectData.

Я уже видел подобные вопросы, которые уже задавались, но они несодержать четкий ответ для решения проблемы.Если кто-нибудь может дать мне либо конкретное решение, либо общий принцип, которому нужно следовать, я буду очень признателен.

1 Ответ

0 голосов
/ 05 октября 2018

О каком размере мы говорим здесь?Скорее всего, это связано с буферизацией, необходимой для префикса длины - то, к чему будет обращаться v3, но на данный момент - если файл огромен, прагматический обходной путь может быть:

[ProtoContract]
public class ProjectData
{
    [ProtoMember(1, DataFormat = DataFormat.Grouped)]
    public List<SEModule> modules = new List<SEModule>();

    [ProtoMember(2)]
    public string projectName = "";
}

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

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

...