使用protobuf-net时如何处理System.OutOfMemoryException?

时间:2018-10-05 09:02:14

标签: c# serialization protobuf-net

我在c#应用程序中使用protobuf-net加载和保存程序的“项目文件”。在节省时间的情况下,该程序将创建一个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 = "";
}

创建后,将其压缩并保存到磁盘。我遇到的问题是,在packProjectData函数执行过程中,当模块数量变得非常大(40,000+)时,正在报告System.OutOfMemoryException。

我已经看到类似这样的问题,但是这些问题并未包含明确的答案来解决该问题。如果有人可以给我提供特定的解决方案或遵循的一般原则,将不胜感激。

1 个答案:

答案 0 :(得分:2)

我们在这里谈论什么尺寸?很有可能是由于长度前缀需要缓冲-v3会解决此问题,但目前-如果文件很大,则务实的解决方法可能是:

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

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

这更改了SEModule项的内部编码格式,因此不需要长度前缀。对于SEModule中的某些元素,同样的方法也可能有用,但我看不到要发表评论。

请注意,这会更改数据布局,因此应视为重大更改。