我正在将本地数据解析为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行"
答案 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。