Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 读取MemoryStream时System.OutOfMemoryException_C#_Json_Xml - Fatal编程技术网

C# 读取MemoryStream时System.OutOfMemoryException

C# 读取MemoryStream时System.OutOfMemoryException,c#,json,xml,C#,Json,Xml,我将本地数据解析为JSON,然后将JSON解析为XML。解析到JSON工作得很好,我非常确定一两周前解析到XML也工作得很好——它不是在生产环境中,但我测试了它,它工作得很好。现在我得到了上面提到的例外。这是我的密码: public static string ParseData(Data data) { string xmlString = string.Empty; XmlData xmlData = new XmlData(data); using (Memory

我将本地数据解析为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位于 System.IO.StreamReader.ReadToEnd()\r\n位于 中的Common.Util.LiveScoringXml.ParseData(数据数据) C:\Source\Repos\Latest\Common\Util\LiveScoringXml.cs:第30行“


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

查看以下链接:

您可能经常生成大块数据,并对LOH进行分段,直到找不到足够大的连续块为止


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

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

查看以下链接:

您可能经常生成大块数据,并对LOH进行分段,直到找不到足够大的连续块为止


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

尝试使用
try catch
block来获取更多信息。您必须向我们展示堆栈跟踪。如果您的机器上有sql,它可能会吃掉所有ram,即使在任务管理器中,您似乎已经足够了。在我的例子中,有时系统运行正常,有时内存耗尽。如果你有sql,你应该限制它的内存使用,
GC.Collect
就在
ParseData
里面,看看这是否有什么不同。你对函数的结果做了什么?将其写入磁盘?尝试使用
try catch
block获取更多信息您必须向我们显示堆栈跟踪。如果您的计算机上有sql,它可能会吃掉您所有的ram,即使您的任务管理器中似乎有足够的内存。在我的例子中,有时系统运行正常,有时内存耗尽。如果你有sql,你应该限制它的内存使用,
GC.Collect
就在
ParseData
里面,看看这是否有什么不同。你对函数的结果做了什么?把它写到磁盘上?我从来没有足够的勇气说“……唯一可能的原因是……”几乎是我一生中遇到的任何事情。@UweKeim:好吧,我会重新表述答案,这样它就不那么勇敢了。不管怎么说,这是一种比任何东西都更具文化性的东西,西班牙人的说话方式与德国人不同:)听起来好多了。非常感谢,我从来没有足够的勇气说“……唯一可能的原因是……”几乎是我一生中遇到的任何事情。@UweKeim:好吧,我会重新措辞,这样就不那么勇敢了。不管怎么说,这是一种比任何东西都更具文化性的东西,西班牙人的说话方式与德国人不同:)听起来好多了。谢谢