我进行了广泛搜索,但未能找到解决问题的方法。
我有一个典型的情况,一个过程正在逐渐吞噬记忆。该过程最终会抛出OutofMemory异常。过去通过构建一个具有更大内存的特殊机器来处理这个问题。
此过程仅对我们的一个客户造成爆炸,该客户拥有约450,000条记录。我们遍历帐户集合并构建一个类对象,然后将其传递给xml序列化程序。此对象具有几个不会同时填充的属性和方法。根据每个帐户记录中的信息填充这些对象。
我已经检查了我们调用XML Serializer的构造函数的方式,它的格式是存储xml程序集而不是每次都创建新的程序集。因此,我不相信由于动态程序集的创建而导致内存泄漏。
我们如何调用序列化程序:Dim k1Serializer As New XmlSerializer(GetType(ClassObject))
我的问题是:
序列化大型对象时,序列化程序是否会查看每个可能的可序列化对象或仅查看对象填充的对象?
这个大类对象的序列化是否会导致问题?
我注意到当我们传入序列化对象时,它不会自动写入指定的文件。我想,需要花几秒钟来序列化对象,然后将其写出来。事实上,我们是如此迅速地迭代这么多记录,以至于序列化程序没有足够的时间写出文件然后释放内存?
我真的在我的智慧结束,任何帮助将不胜感激。如果需要任何其他信息,请告诉我。
由于
答案 0 :(得分:0)
同时将450,000条记录加载到内存中只是为了将其写入XML文件对我来说并不是一个好主意。我建议您使用XMLWriter而不是XML Serializer重新构建功能,这样整个信息集就不需要同时保存在内存中。
答案 1 :(得分:-1)
考虑查看XmlTextWriter。您可以手动写出数据的XML数据,而无需使用XboxSerializer的黑盒子。
一个简单的例子,用于遍历项目列表,并将它们写出到XML文件中:
var settings = new System.Xml.XmlWriterSettings
{
OmitXmlDeclaration = true,
Indent= true
};
string myXmlNamespace = "urn:myXmlNamespace";
using (var fileStream =
new FileStream("MyFile.xml", FileMode.Create, FileAccess.Write, FileShare.None))
{
using (XmlWriter w = XmlWriter.Create(fileStream, settings))
{
w.WriteStartElement("root", myXmlNamespace);
for (var elt in myCollection)
{
w.WriteStartElement("elt",myXmlNamespace);
w.WriteElementString("prop1",myXmlNamespace,elt.Property1);
w.WriteElementString("prop2",myXmlNamespace,elt.Property2);
w.WriteEndElement();
}
}
}
你必须为“反序列化”做反问。打开文件流,然后使用XmlTextReader()读取XML,并实例化要添加到集合中的元素。