我正在开发一个带有 XML 数据库的应用程序。我有大型 XML 文件,我必须在其中读取和写入数据。问题是我不想将整个 XML 文件加载到内存中,也不想因为性能问题而循环遍历整个文件。因为如果我将整个文件加载到内存中,这会影响应用程序的性能,并且可能会因为内存泄漏而导致应用程序崩溃。
我需要一种足够的方式将 XML 写入和读取到文件中,这不会影响性能和内存。
任何帮助将不胜感激。
如果这个 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 或任何类似的东西!
看看这个,它会给你一些关于快速阅读 xml 的想法。http://msdn.microsoft.com/en-us/library/system.xml.xmltextreader.aspx
已经有一些关于在stackoverflow中编写xml文件的线程。
但是,我认为如果您正在寻找非常好的性能,一些数据库解决方案,例如 sqlserver、mongodb 可能是更好的选择
在某种程度上,性能完全取决于您的应用程序运行的 .NET 版本。另一个快速参考是Microsoft 模式和实践文章。
有 4 种方式:XMLDocument、XPathNavigator、XmlTextReader、Linq to XML,我认为它们之间的区别很有价值!
xml文档:
它表示 XML 文件的内容。从文件加载它时,您将整个文件读入内存。一般来说,如果您使用 XmlDocument,XML 解析会慢得多,它更适合将整个 DOM 加载到 RAM 中,......您的应用程序的内存消耗可能就像毛毛虫移动一样!
使用 DOM 模型和 XmlDocument 或 XPathDocument 类来解析大型 XML 文档可能对内存有很大的要求。这些需求可能会严重限制服务器端 Web 应用程序的可伸缩性。
XPath 或 LINQ-To-XML:
如果您更关心性能,我个人不建议使用 XPath 或 LINQ-To-XML 查询。XPathNavigator 提供了一个用于导航和编辑 XML 数据的游标模型。
xml阅读器:
与 XmlDocument 相比,它可能有助于实现更好的性能。正如其他人已经建议的那样。XmlReader 是一个抽象类,它提供了一个 API,用于对 XML 数据流进行快速、只进、只读的解析……它可以从文件、互联网位置或任何其他数据流中读取。从文件中读取时,您不会一次加载整个文档。这就是它的亮点。
XmlTextReader:XmlTextReader,是XmlReader的一个实现。使用 XmlTextReader 以向前的只读方式快速处理 XML 数据,而无需使用验证、XPath 和 XSLT 服务。
EOL 规范化始终在 XmlReader.Create 中的 XmlReader 中打开,这会影响 XDocument。默认情况下,XmlTextReader 上的规范化是关闭的,这会影响 XmlDocument 和 XmlNodeReader。它可以通过 Normalization 属性打开。
设计注意事项
基准测试