【问题标题】:Increasing Linq to XML Parsing performance提高 Linq to XML 解析性能
【发布时间】:2013-11-14 13:58:29
【问题描述】:

我一直在使用 Linq to XML 和通过 foreach 循环解析 XML 解析器。

程序可以运行,但是速度很慢,因为我有 2 个根,里面有很多元素,这两个根的元素可以相关。 (文件不大,有1Mb到5Mb)。

所以,澄清一下,我在 .xml 文件中有 <Datas> 和 <Symbols> 根。 <Symbols> 中的元素通过每个<Symbol> 子<Type> 与<Datas> 元素相关联,如下所示:

<Datas>
     <Data>
        <Name>**SymbolType_1**</Name> // (As you can see, <Name> = <Type> of the <Symbol>)
        <Type>DataType1</Type>
            <Subitem>
                <Name>SubitemName1</Name>
                <Type>SubitemType1</Type>
            </Subitem>
            <Subitem>
                <Name>SubitemName1</Name>
                <Type>SubitemType1</Type>
            </Subitem>
     </Data>
     <Data>
        <Name>**SymbolType_2**</Name>
            <Subitem>
                <Name>SubitemName1</Name>
                <Type>SubitemType1</Type>
            </Subitem>
            <Subitem>
                <Name>SubitemName1</Name>
                <Type>SubitemType1</Type>
            </Subitem>
     </Data>
     [...]
</Datas>

<Symbols>
     <Symbol>
         <Name>SymbolName_1</Name>
         <Type>**SymbolType_1**</Type>
     </Symbol>
     <Symbol>
         <Name>SymbolName_1</Name>
         <Type>**SymbolType_1**</Type>
     </Symbol>
     [...]
</Symbols>

因此,也有可能一些&lt;Subitem&gt; &lt;Type&gt; 连接到另一个&lt;Data&gt;,从而创建一个包含10 个元素的结构。

我现在要做的是使用foreach 循环获取每个&lt;Symbol&gt; 并应用方法来查看每个&lt;Data&gt; 及其各自的&lt;Subitem&gt; 子级。

由于我从 C# 开始,我想知道将所有 &lt;Symbol&gt;、&lt;Data&gt; 和 &lt;Subitem&gt; 存储在两个或三个不同的 &lt;List&gt; 中是否是个好主意,而不是解析列表的文件。

另外,将&lt;Symbols&gt; 拆分为“区域”并使用多个 foreach 循环同时负责解析每个区域是否明智(并且可能)?

最后我想知道是否可以存储每个&lt;Data&gt;的位置,所以我不需要从根&lt;Datas&gt;开始解析。

非常感谢。

【问题讨论】:

  • 我不确定我是否完全理解您的用法。如果 XML 很小,我会尽快将其反序列化(例如使用XmlSerializer)到对象模型中,并创建一些不错的字典查找,而不是使用 Linq-to-XML。编辑:我不知道 Linq-to-XML 是否有一些优化,但如果您经常重新查询数据或重新迭代 XML 树,这听起来可能会影响性能。跨度>
  • 您可以使用 xpath 导航到 xml 文档中的特殊节点。
  • 解析 XML 最快的方法是使用 XmlTextReader msdn.microsoft.com/en-us/library/…
  • @ChrisSinclair linq-to-xml 将整个文件读入内存。一旦被解析,它就以XNode 对象图的形式存在。
  • 哦,另外,如果您在谈论性能,您能详细介绍一下吗?例如,简单地反序列化 1 到 5 MB 的 XML 数据相当快。我的意思是,根据一些相对于其他操作的基准,它可能会 slow,但你想用它做什么?您是否尝试每秒阅读数百次?一次读入内存只需要很少的时间。

标签: c# xml linq parsing


【解决方案1】:

您可能应该使用字典来存储每个项目;即

var symbols = new Dictionary<string, Symbol>();
var datas = new Dictionary<string, Data>();

然后在启动时加载它们;使用列表意味着您(可能)必须遍历整个集合才能找到正确的项目;使用字典,您将能够通过键直接访问它。

【讨论】:

  • 我将检查字典的使用情况,因为它似乎提供了一种避免解析整个&lt;Datas&gt; 以找到一个&lt;Data&gt; 元素的方法,每次我检查&lt;Symbol&gt; 或@987654325 时@。谢谢:)
  • 您也可以尝试 ConcurrentDictionary,然后使用 Parallel.ForEach 来处理您的 XML,但您至少需要 .Net 4.0。
猜你喜欢
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多