C# 读取大型xml文件会使服务器停止工作—内存不足
我有一段代码,可以很好地用于普通文件。但是对于非常大的文件,它会使服务器停止工作 这是:C# 读取大型xml文件会使服务器停止工作—内存不足,c#,xml,C#,Xml,我有一段代码,可以很好地用于普通文件。但是对于非常大的文件,它会使服务器停止工作 这是: XmlReader reader = null; try { reader = XmlReader.Create(file_name + ".xml"); XDocument xml = XDocument.Load(reader); XmlNamespaceManager namespaceManager = GetNamespaceManager(reader); XEl
XmlReader reader = null;
try
{
reader = XmlReader.Create(file_name + ".xml");
XDocument xml = XDocument.Load(reader);
XmlNamespaceManager namespaceManager = GetNamespaceManager(reader);
XElement root = xml.Root;
//XAttribute supplier = root.XPathSelectElement("//sh:Receive/sh:Id", namespaceManager).Attribute("Authority");
//string version = root.XPathSelectElement("//sh:DocumentId/sh:Version", namespaceManager).Value;
var nodes = root.XPathSelectElements("//eanucc:msg/eanucc:transact", namespaceManager);
return nodes;
}
catch
{ }
我认为这是导致服务器内存问题的原因。如何修复此问题?尝试将读取器放入using(){}子句中,以便在使用后将其处理掉
try
{
using(var reader = XmlReader.Create(file_name + ".xml"))
{
XDocument xml = XDocument.Load(reader);
XmlNamespaceManager namespaceManager = GetNamespaceManager(reader);
XElement root = xml.Root;
var nodes = root.XPathSelectElements("//eanucc:msg/eanucc:transact", namespaceManager);
return nodes;
}
}
catch
{ }
听起来好像一次读取的数据太多了。您必须一次迭代一个元素,使用
XmlReader
作为光标,一次将一个元素转换为XElement
public static IEnumerable<XElement> ReadTransactions()
{
using (var reader = XmlReader.Create(file_name + ".xml"))
{
while (reader.ReadToFollowing("transact", eanuccNamespaceUri))
{
using (var subtree = reader.ReadSubtree())
{
yield return XElement.Load(subtree);
}
}
}
}
公共静态IEnumerable ReadTransactions()
{
使用(var reader=XmlReader.Create(文件名+“.xml”))
{
while(reader.readtofollow(“transact”,eanuccNamespaceUri))
{
使用(var subtree=reader.ReadSubtree())
{
收益率-收益率-负荷(子树);
}
}
}
}
注意:这假设在任何其他级别都不存在“transact”元素。如果有,您需要更加小心地使用XmlReader
,而不仅仅是调用readtofollow
。还要注意,您需要找到eanucc
别名的实际名称空间URI
不要忘记,如果您尝试一次性读取所有这些信息(例如,通过调用
ToList()
),那么您的内存仍然会不足。您需要流式传输信息。(不清楚您打算如何处理这些元素,但您需要仔细考虑。)在您的答案中添加更多细节。避免一行/简短的回答。回答时不要问问题,使用注释。有多少个transact
元素?(这甚至可能不可行…)您能告诉我们导致错误的文件大小吗?是单个文件还是多个大文件?@Jras是单个文件。它有大约8000个节点。好的,所以基本上你试图读取的数据超过了你的内存容量。那是行不通的。我猜想,您必须使用迭代器块。@petko_stankoski:看到我的答案了吗。但是你也应该阅读迭代器块来理解它,我试图计算它们,以找出文件中有多少transact元素。我如何调用ReadTransactions()?@petko_stankoski:如果你只是想计算它们,你根本不需要加载它们。我希望你以前说过。也就是说,您可以始终使用int count=ReadTransactions.count()代码>Tnx,你真的帮了大忙。但是reader.ReadSubtree()返回空。@petko_stankoski:“返回空”是什么意思?你想用它做什么?没有给出XML的示例是没有帮助的。