C# 序列化OutOfMemoryException

C# 序列化OutOfMemoryException,c#,xml,serialization,out-of-memory,C#,Xml,Serialization,Out Of Memory,我有一个程序,它将一个基于xml的大型结构构建到类中,并将它们保存在一个要序列化的集合中。。。称之为合同。每个契约进入集合并由表示XML文档中节点的对象组成。这一切都很好,但现在我们的收藏中有10000件。Task manager仍然将我们的8GB机器的使用率设置为586兆 当我序列化到一个文件时,问题出现了: XmlSerializer serializer = new XmlSerializer(typeof(PolicyExtract)); XmlSeria

我有一个程序,它将一个基于xml的大型结构构建到类中,并将它们保存在一个要序列化的集合中。。。称之为合同。每个契约进入集合并由表示XML文档中节点的对象组成。这一切都很好,但现在我们的收藏中有10000件。Task manager仍然将我们的8GB机器的使用率设置为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
而没有文件


有什么想法吗?

在反序列化大型XML文件(>1.4 GB)时,我们遇到了相反方向的类似问题。在达到进程限制之前,我们还经历了OutOfMemoryException。
我也喜欢XML序列化,因为它简单,但是对于大部分数据,需要对序列化过程有更多的控制,因为XML处理通常与内存中创建的大量字符串相连接。
经过数千次迭代之后,我们能够用XmlReader和调用解决我们的问题。在您的情况下,使用来写入数据并在迭代后抛出GC.Collect也可以缓解问题。您需要多久调用一次垃圾收集器取决于您的场景,可能需要一些尝试和错误。不要太频繁地调用它,因为它是一个重量级操作。
此外,您还应该检查数据结构是否存在可以用方法替换的重复数据。

缺点当然是序列化代码变得更长,更不容易处理,因为您可能需要在序列化代码中反映数据结构的更改。

转到项目属性->构建选项卡->平台目标:将“任意CPU”更改为“x64”。

一个32位进程,即使在64位计算机上,也只能访问最大3GB的数据-请确保以64位的方式运行该进程。。。。每个对象实例只有2GB,即使在64位计算机上也是如此。@SriramSakthivel-默认情况下,2GB,带有某些操作系统启动开关,3GB。实际的地址空间是4GB,但并非所有的地址空间都可用。@Oded啊,我没有注意到最大值这个词。。NVMI可以想象XmlSerializer具有相当大的内部开销。如果你达到了极限,要么像其他评论员所说的那样增加记忆力;或者手动写入集合开始/结束标记,并仅使用XmlSerializer对项进行序列化。为此,您需要64位基础结构。了解您收到的异常情况将非常有用。。。