0

我已经编写了这个 LINQ to xml 查询:

Dim xd1 As XDocument = XDocument.Load("C:\doc1.xml")
Dim xd2 As XDocument = XDocument.Load("C:\doc2.xml")
Dim xd3 As XDocument = XDocument.Load("C:\doc3.xml")

Dim q = From a In xd1...<row>, b In xd2...<row>, c In xd3...<row> Where
        a.@Field1 = "pippo" AndAlso b.@Field2 = a.@RifField2 AndAlso c.@Field3 = a.@RifField3 Select
        b.@Field4, b.@Field5, c.@Field6

Dim s As String = ""
For Each a In q
    s &= a.Campo4 & " - " & a.Campo5 & " - " & a.Campo6 & vbCrLf
Next

TextBlock1.Text = s

但是这段代码需要大约 5 秒才能执行。当然我会更改查询,但是在调试时我已经看到该行

暗淡 q = 从...

需要一个istant来执行,并且接下来的每一行都会很快消失,直到循环“For Each”完成要滚动的项目并且它必须退出。然后执行停止 5 秒,然后循环退出。

如果我写,我会得到同样的延迟

Dim q = (From ... ).ToArray

or else if I write

Dim i As Long = q.Count

最奇怪的是,需要很长时间才能看到项目列表完成,并且必须退出循环。一个细节:查询 q 只有 8 个项目。

你有什么建议可以解决我的性能问题吗?皮莱吉

4

1 回答 1

1

让我们在这里看看:

您有 3 个 XML 文件,假设它们row每个都有 K、L、M 元素。

然后,您正在对所有这些元素进行笛卡尔积,这意味着您有 K*L*M 可能的结果来评估。根据 K、L 和 M 的大小,这将是一项非常快的工作——如果每个只有 1000 行,那么您就有 10 亿个可能的结果。这就是速度如此缓慢的原因。

您应该先进行过滤以避免创建如此巨大的笛卡尔积 -在创建笛卡尔积a.@Field1 = "pippo" 之前移动条件,这应该会显着提高性能。

例如,如果在第一个 XML 文件中只有 10 行与“pippo”匹配,那么您现在只有 10*1000*1000 个可能的结果 = 1000 万 - 仍然很多,但只有您的行数的 1/100当前查询。

在 C# 中(我不是 VB 人),就像

var query = from a in xd1.Descendants("row").Where(x=> x.Field1 == "pippo")
            from b in xd2.Descendants("row")
            from c in xd3.Descendants("row")
            //rest of query
于 2012-04-29T00:27:22.670 回答