我正在使用XML数据库开发一个应用程序。我有大型XML文件,我必须在其中读取和写入数据。 问题是我不想在内存中加载整个XML文件也不想因为性能问题而遍历整个文件。因为如果我将整个文件加载到内存中,这将影响应用程序性能,并可能因内存韭菜而导致应用程序崩溃。
我需要一种足够的方法来将XML写入和读取到文件中,这对性能和内存没有影响。
任何帮助将不胜感激。
答案 0 :(得分:4)
如果此XML决定不属于您,您必须处理它(请参阅完整的MSDN示例http://msdn.microsoft.com/en-us/library/bb387013.aspx)
static IEnumerable<XElement> StreamCustomerItem(string uri)
{
using (XmlReader reader = XmlReader.Create(uri))
{
XElement name = null;
XElement item = null;
reader.MoveToContent();
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
name = XElement.ReadFrom(reader) as XElement;
break;
}
}
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
item = XElement.ReadFrom(reader) as XElement;
if (item != null)
{
XElement tempRoot = new XElement("Root", new XElement(name));
tempRoot.Add(item);
yield return item;
}
}
}
}
}
}
}
但是,如果您控制决定,那么,您应该忘记XML。有几个选项可以帮助您和您的应用程序正常工作,而不会有太多麻烦。
你甚至可以使用MySQL,MariaDB或类似的东西!
答案 1 :(得分:1)
看看这个,它会让你对快速阅读xml有所了解。 http://msdn.microsoft.com/en-us/library/system.xml.xmltextreader.aspx
有一些关于在stackoverflow中编写xml文件的线程。
How to write (big) XML to a file in C#?
但是,我认为如果您正在寻找非常好的性能,一些数据库解决方案,例如sqlserver,mongodb可能是更好的选择
答案 2 :(得分:1)
使用此link。
使用XmlReader,这是一个很好的选择,允许我们只将当前记录留在内存中,这可以极大地提高性能。
编辑:永远不要使用Load方法。它会将整个XML文件加载到内存中,如果此文件非常大,不仅查询可能需要很长时间才能执行,但可能会失败记忆。
答案 3 :(得分:0)
在某种程度上,性能完全取决于运行应用程序的.NET版本。另一个快速参考是Microsoft Patterns and Practices article。
有4种方式:XMLDocument,XPathNavigator,XmlTextReader,Linq to XML,我认为它们之间的差异是有价值的!
XmlDocument :
它表示XML文件的内容。从文件加载时,您将整个文件读入内存。一般来说,如果你使用的是XmlDocument,那么XML解析要慢得多,而XmlDocument更适合在RAM中加载整个DOM, ......你的应用程序的内存消耗可能就像毛毛虫移动一样!
使用DOM模型和XmlDocument或XPathDocument类来解析大型XML文档会对内存产生很大的需求。这些要求可能会严重限制服务器端Web应用程序的可伸缩性。
XPath或LINQ-To-XML :
如果您对性能的关注更多,我个人不建议使用XPath或LINQ-To-XML查询。 XPathNavigator提供了一个用于导航和编辑XML数据的游标模型。
<强>的XmlReader 强>:
与XmlDocument相比,它可能有助于提高性能。正如其他人已经建议的那样XmlReader是一个抽象类,它提供了一个API,用于快速,仅向前,只读解析XML数据流......它可以从文件,Internet位置或任何其他数据流中读取。从文件中读取时,不一次加载整个文档。这就是它的亮点。
<强> XmlTextReader的强>: XmlTextReader,是XmlReader的一个实现。使用XmlTextReader以前向只读方式快速处理XML数据,而无需使用验证,XPath和XSLT服务。
Eml规范化始终在XmlReader.Create的XmlReader中打开,这会影响XDocument。默认情况下,规范化在XmlTextReader上关闭,这会影响XmlDocument和XmlNodeReader。它可以通过Normalization属性打开。
设计注意事项
基准测试