读取MemoryStream时出现System.OutOfMemoryException

时间:2017-10-09 07:48:58

标签: c# json xml

我正在将本地数据解析为JSON,然后我将JSON解析为XML。解析为JSON工作正常,我很确定一两周前解析为XML也工作正常 - 它不是在生产中,但我测试了它并且它起作用了。现在我得到了上述异常。这是我的代码:

public static string ParseData(Data data)
{
    string xmlString = string.Empty;
    XmlData xmlData = new XmlData(data);

    using (MemoryStream memoryStream = new MemoryStream())
    using (StreamReader reader = new StreamReader(memoryStream))
    {
        xmlSerializer.WriteObject(memoryStream, xmlData);
        memoryStream.Position = 0;
        xmlString = reader.ReadToEnd(); //exception occurs here
    }
    return xmlString;
}

当异常发生时,memoryStream.Position的值等于它的长度,我仍然在RAM中有200-300 mb。它是64位应用程序和64位系统。我检查了类似的问题,但在我的情况下,没有大量的数据(json最大为1.5mb)。

更新。堆栈跟踪:

  

"在System.Text.StringBuilder.ToString()\ r \ n at   System.IO.StreamReader.ReadToEnd()\ r \ n at   Common.Util.LiveScoringXml.ParseData(数据数据)中   C:\ Source \ Repos \ Latest \ Common \ Util \ LiveScoringXml.cs:第30行"

1 个答案:

答案 0 :(得分:4)

如果你有一个64位应用程序,你问题的最可能原因(除了.Net Framework中的一个错误)是由于大对象堆内存碎片而导致的问题,任何大于80k的对象存储在那里。

检查以下链接:

Why Large Object Heap and why do we care?

https://blogs.msdn.microsoft.com/dotnet/2011/10/03/large-object-heap-improvements-in-net-4-5/

你可能经常产生大块数据并将LOH分段,直到你找不到足够大的连续块为止。

有一些策略可以解决问题,例如重用对象而不是创建和GC。