0

我正在开发一个带有 XML 数据库的应用程序。我有大型 XML 文件,我必须在其中读取和写入数据。问题是我不想将整个 XML 文件加载到内存中,也不想因为性能问题而循环遍历整个文件。因为如果我将整个文件加载到内存中,这会影响应用程序的性能,并且可能会因为内存泄漏而导致应用程序崩溃。

我需要一种足够的方式将 XML 写入和读取到文件中,这不会影响性能和内存。

任何帮助将不胜感激。

4

4 回答 4

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。有几个选项可以帮助您和您的应用程序正常工作,而不会带来太多麻烦。

  1. SQL 紧凑型。来自 Microsoft 的简单易用的 SQL 方法,并且不需要 SQL 服务器实例。http://www.microsoft.com/en-us/sqlserver/editions/2012-editions/compact.aspx
  2. SQL 精简版。适用于 .net 甚至 Windows 8 应用程序,简单且非常稳定。http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki

你甚至可以使用 MySQL、MariaDB 或任何类似的东西!

于 2013-10-08T11:36:13.097 回答
1

看看这个,它会给你一些关于快速阅读 xml 的想法。http://msdn.microsoft.com/en-us/library/system.xml.xmltextreader.aspx

已经有一些关于在stackoverflow中编写xml文件的线程。

如何将(大)XML 写入 C# 中的文件?

但是,我认为如果您正在寻找非常好的性能,一些数据库解决方案,例如 sqlserver、mongodb 可能是更好的选择

于 2013-10-08T10:49:38.940 回答
1

使用此链接

使用 XmlReader,它是一个很好的替代方案,它允许我们只将当前记录放入内存,这可以极大地提高性能。

编辑:永远不要使用 Load 方法。它会将整个 XML 文件加载到内存中,如果这个文件很大,不仅查询可能需要很长时间才能执行,而且可能会因内存不足而失败。

于 2013-10-08T10:52:43.593 回答
0

在某种程度上,性能完全取决于您的应用程序运行的 .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 属性打开。

设计注意事项

基准测试

于 2017-01-29T19:45:48.013 回答