【问题标题】:optimisation xml handling within vb.net applicationvb.net 应用程序中的优化 xml 处理
【发布时间】:2014-06-27 13:59:18
【问题描述】:

我有这个 sn-p,我需要优化它以更快:

Dim lst = (From t In DocElet.ChildNodes Select ID = t.item("ID").outerxml).Distinct().ToList()
       Parallel.For(0, lst.Count, Sub(i)
         Dim P As XmlElement = GetElement(lst(i))
       Dim ls = (From t In DocElet.ChildNodes Where t.item("ID").innerText = P.InnerText Select t)
         Parallel.ForEach(ls, Sub(D)
         Dim verif_date As String = D.Item("DAD").InnerText
        Sej.ID = D.Item("ID").InnerText
         End Sub)
            End Sub)

这是Xml结构:

<?xml version="1.0" encoding="utf-8"?>
<PatientData>
<Sejour><ID></ID><DAD></DAD></Sejour>
  </PatientData>

我在问如何修复我的代码,因为在列表包含 20000 个元素的情况下需要很长时间(50 秒)?

【问题讨论】:

  • 为了获得更好的帮助,您应该描述您想要实现的目标,以及您的 XML 的结构是什么。
  • 我相信这个问题更适合Code Review网站。
  • @HamletHakobyan 请看我的编辑
  • 好的,...现在,你想如何处理这个 XML?

标签: xml vb.net .net-4.0 linq-to-xml


【解决方案1】:

OuterXml/InnerText 方法可能很慢,因为它们需要遍历 XML 树并从所有元素构建新的 XML/文本。

看起来您正在寻找一些 &lt;ID&gt; 节点的匹配值。如果此类节点仅包含单个值而不包含子树,请使用 XmlElement.Value

附注:使用Parallel.For/Parallel.ForEach 从多个线程访问 XML 不能保证正常工作,因为这些类不是线程安全的。

【讨论】:

  • 感谢您的回答 :) 。我使用Parallel.For/Parallel.ForEach 代替普通循环来最小化执行时间
  • @Lamloumi 您的电话...有很多方法可以编写随机行为的代码,并且对非线程安全对象的非同步多线程访问是其中一种方法。我更喜欢 throw InvlaidOperation() :) 作为第一行,因为它使代码更快,并且始终保证相同的行为,这与希望多线程访问 XmlElement 能够正常工作不同,尽管 MSDN 上有信息。
  • there are many ways to write randomly behaving code and non-synchronized multithreaded access to non-thread-safe objects 。可以举个例子吗
  • @Lamloumi - 你已经在问题中提供了样本 - 不确定你在“你能举个例子”中究竟在寻找什么。由于XmlElement 和相关类没有记录为线程安全,这意味着没有特别保证代码在不同运行之间的数据上以相同的方式工作。这是XmlDocument thread safety 的帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多