我有一个程序,它将一个基于xml的大型结构构建到类中,并将它们保存在一个要序列化的集合中......称之为契约。每个合同都进入集合,由对象组成,这些对象将代表XML文档中的节点。这一切都很精致和花花公子,但现在我们正在收集10000件物品。任务管理器仍然使我们在8 GB的机器上使用586兆。
当我序列化到文件时出现问题:
XmlSerializer serializer = new XmlSerializer(typeof(PolicyExtract));
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("ent", "http://xxxxxx.com/V2.0/enrollmententities");
StreamWriter fs = new StreamWriter(filePath);
serializer.Serialize(fs, this, ns);
fs.Close();
这是班级或集合本身。该文件很大(如预期的那样)但不足以占用所有内存。我此时收到System.OutOfMemoryException
,根本没有生成任何文件。
所以回顾一下,我正在尝试将一个大型集合(仍然在内存限制内)序列化到一个文件中并接收OutOfMemoryException
而没有文件。
有什么想法吗?
答案 0 :(得分:0)
在反序列化大型XML文件(> 1.4 GB)时,我们遇到了相反的问题。在达到流程限制之前,我们也经历了OutOfMemoryExceptions 我也喜欢XML序列化的简单性,但是对于大部分数据,需要对序列化过程有更多的控制,因为XML处理通常与在内存中创建的大量字符串相关联。 我们能够通过XmlReader解决我们的问题,并在数千次迭代后调用GC.Collect。在您的情况下,使用XmlWriter来编写数据并在一些迭代后抛出GC.Collect也应该可以缓解问题。您需要多久调用一次垃圾收集器取决于您的场景,并可能涉及一些试验和错误。不要经常打电话,因为这是一项重量级的操作 此外,您应检查数据结构是否存在可能由方法替代的重复数据 下行当然是序列化代码变得更长并且不易处理,因为您可能需要反映序列化代码中数据结构的变化。