决定何时使用 XmlDocument 与 XmlReader

2023-12-20

我正在优化自定义对象 -> XML 序列化实用程序,一切都已完成并正常工作,这不是问题。

它的工作原理是将文件加载到XmlDocument对象,然后递归地遍历所有子节点。

我想也许使用XmlReader而不是有XmlDocument加载/解析整个内容会更快,所以我也实现了该版本。

算法完全相同,我使用包装类来抽象处理处理的功能XmlNode vs. an XmlReader。例如,GetChildren方法yield返回一个子元素XmlNode或子树XmlReader.

因此,我编写了一个测试驱动程序来测试这两个版本,并使用了一个重要的数据集(一个包含大约 1,350 个元素的 900kb XML 文件)。

然而,使用 JetBrains dotTRACE,我发现XmlReader版本实际上比XmlDocument版本!似乎涉及一些重要的处理XmlReader当我迭代子节点时读取调用。

所以我说这么多就是为了问这个:

有什么优点/缺点XmlDocument and XmlReader,在什么情况下应该使用其中之一?

我的猜测是存在一个文件大小阈值XmlReader性能变得更加经济,并且内存占用也更少。然而,该阈值似乎高于 1MB。

我正在打电话ReadSubTree每次处理子节点:

public override IEnumerable<IXmlSourceProvider> GetChildren ()
{
    XmlReader xr = myXmlSource.ReadSubtree ();
    // skip past the current element
    xr.Read ();

    while (xr.Read ())
    {
        if (xr.NodeType != XmlNodeType.Element) continue;
        yield return new XmlReaderXmlSourceProvider (xr);
    }
}

该测试适用于单个级别的许多对象(即宽和浅) - 但我想知道效果如何XmlReader当 XML 又深又广时,费用如何? IE。我正在处理的 XML 很像一个数据对象模型,1 个父对象到许多子对象,等等:1..M..M..M

我事先也不知道我正在解析的 XML 的结构,因此我无法对其进行优化。


我一般都看过不是从最快的角度来看,而是从内存利用率看法。对于我使用它们的使用场景(典型的企业集成)来说,所有实现都足够快。

然而,我失败的地方(有时甚至是惊人的)是没有考虑到我正在使用的 XML 的一般大小。如果你提前考虑一下,你可以避免一些悲伤。

XML 在加载到内存中时往往会膨胀,至少对于像这样的 DOM 读取器来说是这样XmlDocument or XPathDocument。大概是10:1?确切的数量很难量化,但如果磁盘上有 1MB,那么内存中就会有 10MB,甚至更多。

使用任何读取器将整个文档完整加载到内存中的进程(XmlDocument/XPathDocument)可能会遭受大对象堆碎片的影响,这最终会导致OutOfMemoryException(即使有可用内存)导致服务/进程不可用。

由于大小大于 85K 的对象最终会出现在大型对象堆上,并且使用 DOM 读取器会出现 10:1 的大小爆炸,因此您可以看到,在从以下位置分配 XML 文档之前不需要花费太多时间:大对象堆。

XmlDocument http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.aspx非常容易使用。它唯一真正的缺点是它将整个 XML 文档加载到内存中进行处理。它使用起来非常简单。

XmlReader http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.aspx是一个基于流的读取器,因此通常会使您的进程内存利用率保持平稳,但更难以使用。

XPathDocument http://msdn.microsoft.com/en-us/library/system.xml.xpath.xpathdocument.aspx往往是 XmlDocument 的更快、只读版本,但仍然遭受内存“膨胀”的困扰。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

决定何时使用 XmlDocument 与 XmlReader 的相关文章

  • 在 C# 中创建具有单独列的分隔文本

    我一直在尝试在 C 中创建一个制表符限制的文本文件 以便数据正确显示在单独的列中 Firstname Lastname Age John Smith 17 James Sawyer 31 我尝试过 t 字符 但我得到的只是 Firstnam
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • 单击 form2 上的按钮触发 form 1 中的方法

    我对 Windows 窗体很陌生 我想知道是否可以通过单击表单 2 中的按钮来触发表单 1 中的方法 我的表格 1 有一个组合框 我的 Form 2 有一个 保存 按钮 我想要实现的是 当用户单击表单 2 中的 保存 时 我需要检查表单 1
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 如何使用 watin 中的 FileUploadDialogHandler 访问文件上传对话框

    我正在使用 IE8 和 watin 并尝试通过我的网页测试上传文件 我不能简单地使用 set 方法设置上传文件 例如 ie FileUpload Find ById someId Set C Desktop image jpg 因为上传文本
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • Visual Studio 中的测试单独成功,但一组失败

    当我在 Visual Studio 中单独运行测试时 它们都顺利通过 然而 当我同时运行所有这些时 有些通过 有些失败 我尝试在每个测试方法之间暂停 1 秒 但没有成功 有任何想法吗 在此先感谢您的帮助 你们可能有一些共享数据 检查正在使用
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • C++ 密码屏蔽

    我正在编写一个代码来接收密码输入 下面是我的代码 程序运行良好 但问题是除了数字和字母字符之外的其他键也被读取 例如删除 插入等 我知道如何避免它吗 特q string pw char c while c 13 Loop until Ent
  • memset 未填充数组

    u32 iterations 5 u32 ecx u32 malloc sizeof u32 iterations memset ecx 0xBAADF00D sizeof u32 iterations printf 8X n ecx 0
  • 使用 GROUP 和 SUM 的 LINQ 查询

    请帮助我了解如何使用带有 GROUP 和 SUM 的 LINQ 进行查询 Query the database IEnumerable
  • 使用 GhostScript.NET 打印 PDF DPI 打印问题

    我在用GhostScript NET http ghostscriptnet codeplex com打印 PDF 当我以 96DPI 打印时 PDF 打印效果很好 但有点模糊 如果我尝试以 600DPI 打印文档 打印的页面会被极大地放大
  • 如何使用 Word Automation 获取页面范围

    如何使用办公自动化找到 Microsoft Word 中第 n 页的范围 似乎没有 getPageRange n 函数 并且不清楚它们是如何划分的 这就是您从 VBA 执行此操作的方法 转换为 Matlab COM 调用应该相当简单 Pub

随机推荐

  • 从 Windows 服务执行 Process.Start 时访问被拒绝

    我正在尝试以另一个用户的身份从服务运行一个进程 Process Start applicationPath params account SecureStringPassword 服务正在 本地系统 帐户下运行 The account参数是
  • SharedArrayBuffer 未定义

    我正在使用一个名为react canvas 从几天前开始 一直输出一条错误消息 p 标签应在网络浏览器 包括 Chrome 中显示画布的区域中 我在用nextjs 我附上package json below SharedArrayBuffe
  • 用于 Android 的 Google Place API 来查找城市

    我看过教程 tutorial https developers google com academy apis maps places autocomplete android 在 android i 中使用自动完成文本视图查找城市 我已经
  • 从requirements.txt安装PyTorch

    火炬文档说使用 pip install torch 1 4 0 cpu torchvision 0 5 0 cpu f https download pytorch org whl torch stable html 安装最新版本的 PyT
  • 流星会话替换?

    在最新的 Meteor 版本 版本 0 5 8 中 Session已从服务器端代码中删除 以前我用过Session储藏客户特定的服务器的变量 该功能的替代品是什么 案例示例 User One打开浏览器 User Two打开浏览器 一个调用服
  • 如何在odoo中弹出成功消息?

    我通过单击按钮发送邀请 在单击按钮并成功发送邀请后 会弹出邀请发送成功的消息 但问题是弹出消息的主标题是Odoo Server Error 那是因为我正在使用 raise osv except osv Success Invitation
  • SCNScene 和 SceneKit 编辑器的子类化

    我有带有相机设置的 SCNScene 子类 我想在所有子类中使用它 let scene01 TheSubclassScene let scene02 TheSubclassScene named art scnassets testScen
  • 点击交换课程

    我有一个包含 6 个项目的列表 这些项目位于全局 div navigationaence 中 现在我可以在单击时添加一个类 但现在它们会加起来 这意味着一旦我的六个项目被单击 它们最终都会成为当前代理类 我希望能够删除向单击的项目添加一个类
  • 在 Typescript 中使用 async/await 时未定义 __awaiter

    我在 Typescript 中有以下代码片段 nsp on connection async function socket await this emitInitialPackage nsp currentLine currentCell
  • 当 url 导致临时重定向 (http 302) 时,什么会被索引?

    我正在努力使我们的 很大程度上基于 AJAX 的 网站对搜索引擎更加友好 我们有一个系统 在设置会话变量以更改主页的行为后 某些网址会重定向到主页 这是使用 Controller Redirect 方法创建 ActionResult 来实现
  • 通过 Gremlin 计算大图中的节点/边数?

    通过 Gremlin 计算大图中的节点 边数的最简单且最有效的方法是什么 我发现最好的方法是使用 V 迭代器 gremlin gt g V gather it size 然而 对于大图来说 这不是一个可行的选择V 的文档 http grem
  • numpy 中的加权协方差矩阵

    我想计算协方差C of n的测量p数量 其中每个单独的数量测量都有自己的权重 也就是我的权重数组W与我的数量数组具有相同的形状Q n by p 当地人np cov 函数仅支持赋予各个测量值的权重 即长度向量n 我可以初始化一个p by p矩
  • EF core、Any 无法翻译,将在本地评估

    我有一个程序可以返回我需要的实体 ID 我决定创建此过程 因为应返回给最终用户的实体由相关实体过滤 但 EF Core 不支持相关实体过滤 然后我想使用这个 id 来获取我需要的实体及其相关实体 我正在使用Any operator In m
  • Cleave.js 电话 CA

    我正在尝试使用格式化电话号码字段Cleave js https nosir github io cleave js 它不起作用 但我似乎不明白为什么 我是这样开始的 import Cleave from cleave js var clea
  • 如何在android中的string.xml中添加多段落的长文本

    当我在之间添加许多段落时
  • 组播中的环回

    这个问题是关于在同一主机内发送和接收多播 同时将其发送到其他主机 即使经过几个小时的谷歌搜索 我仍然无法弄清楚多播数据报是如何在同一主机内路由的 下面是问题的详细描述 Linux 盒子 A 通过电缆连接到交换机 路由器 我们将交换机 路由器
  • PHP 转义用户输入的文件名

    我有一个用户可以上传文件的表单 我想将该文件命名为 id lastname firstname pdf 该名称是由用户输入的 我担心他们输入的内容中带有斜杠 否则 类似的事情 path dir filename可能会导致 path uplo
  • 返回 PagedResources 的单元测试 Spring MVC 控制器

    我正在使用 Spring Boot 1 4 1 Spring Data Jpa 和 Spring Data Test 构建一个应用程序 我有以下控制器 我想用它返回分页帐户 RequestMapping method RequestMeth
  • 稠密对称矩阵的特征有效类型

    Does Eigen http eigen tuxfamily org index php title Main Page有存储密集 固定大小 对称矩阵的有效类型吗 嘿 它们无处不在 IE 对于 N 9 它应该只存储 1 9 9 2 45
  • 决定何时使用 XmlDocument 与 XmlReader

    我正在优化自定义对象 gt XML 序列化实用程序 一切都已完成并正常工作 这不是问题 它的工作原理是将文件加载到XmlDocument对象 然后递归地遍历所有子节点 我想也许使用XmlReader而不是有XmlDocument加载 解析整