Skip to main content
 首页 » 编程设计

c#之XML 序列化之大数据(20GB),OutOfMemoryException

2024年02月27日32shihaiming

我有一个问题:我想序列化一个 xml ( 20GB ) 但我得到了一个 out of memory 异常。

对此您有什么建议吗?

我的代码如下:

public static string Serialize(object obj) 
{ 
    string retval = string.Empty; 
 
    if (null!= obj) 
    { 
        StringBuilder sb = new StringBuilder(); 
        using (XmlWriter writer = XmlWriter.Create(sb, new XmlWriterSettings() { OmitXmlDeclaration = true })) 
        {                     
            XmlSerializer serializer = new XmlSerializer(obj.GetType()); 
 
            // We are ommitting the namespace to simplifying passing as parameter 
            XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
            ns.Add("", ""); 
 
            serializer.Serialize(writer, obj); 
        } 
 
        retval = sb.ToString(); 
    } 
    return retval; 
} 

请您参考如下方法:

20 GB 永远不会用作 string (通过 StringBuilder );即使有 <gcAllowVeryLargeObjects>启用,a 的最大理论长度 string只是其中的一小部分。

如果您需要大量数据,则需要使用文件之类的东西(或者基本上:不是 Stream 的 MemoryStream)作为后端。

我还要说 xml 对于大数据来说是一个糟糕的选择。如果您没有紧密绑定(bind)到 xml,我强烈建议您寻找替代工具(如果可以的话,我很乐意提供建议)。

但现在:

string path = "my.xml"; 
XmlWriterSettings settings = ... 
using (XmlWriter writer = XmlWriter.Create(path, settings)) 
{ 
    // ... 
} 

或者如果您实际上是在与套接字等通信:

Stream stream = ... 
XmlWriterSettings settings = ... 
using (XmlWriter writer = XmlWriter.Create(stream, settings)) 
{ 
    // ... 
}