【问题标题】:System.OutOfMemoryException when reading MemoryStream [closed]读取 MemoryStream 时出现 System.OutOfMemoryException [关闭]
【发布时间】:2017-10-09 07:48:58
【问题描述】:

我将本地数据解析为 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 的值等于它的长度,我仍然有大约 200-300 mb 的 RAM。它是 64 位应用程序和 64 位系统。我检查了类似的问题,但就我而言,没有大量数据(json 最大为 1.5mb)。

已更新。堆栈跟踪:

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

【问题讨论】:

  • 尝试使用try-catch 块获取更多信息
  • 你必须向我们展示堆栈跟踪。
  • 如果你的机器上有 sql,它可能会吃掉你所有的内存,即使在你的任务管理器中看起来你已经足够了。在我的情况下,有时系统运行正常,有时它会内存不足。如果你有 sql 你应该限制它的内存使用
  • ParseData 中添加一个GC.Collect 怎么样,看看这是否有什么不同。
  • 你对函数的结果做了什么?写入磁盘?

标签: c# json xml


【解决方案1】:

如果您有一个 64 位应用程序,您的问题最可能的原因(除了 .Net 框架中的错误)是由于大对象堆内存的碎片,任何大于 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'ing 它们。

【讨论】:

  • 我从来没有足够的勇气说“……唯一可能的原因是……”我一生中遇到的任何事情。
  • @UweKeim:好的,我会改写答案,这样它就不那么勇敢了。无论如何,这是比任何东西都更具文化性的东西,西班牙人的说话方式与德国人不同:)
  • 这听起来方式更好。非常感谢?。
猜你喜欢
  • 2021-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多