0

私はこのLINQtoxmlクエリを作成しました:

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秒かかります。確かに私はクエリを変更しましたが、デバッグに入ると、行が

Dim q =From..。

実行するのに時間がかかり、「ForEach」サイクルがアイテムのスクロールを終了して終了するまで、後続のすべての行が非常に速く消えます。その後、実行が5秒間停止し、サイクルが終了します。

書くと同じ遅延が発生します

Dim q = (From ... ).ToArray

or else if I write

Dim i As Long = q.Count

最も奇妙なのは、アイテムリストが終了するのを確認するのに非常に長い時間がかかり、サイクルを終了する必要があることです。詳細:クエリqには8つのアイテムしかありません。

私のパフォーマンスの問題を解決するための提案はありますか?ピレッギ

4

1 に答える 1

1

ここで見てみましょう:

3 つの XML ファイルがあり、それぞれに K、L、Mrow要素があるとします。

次に、これらすべての要素に対してデカルト積を実行します。つまり、評価する可能性のある結果が K*L*M あることを意味します。これは、K、L、および M のサイズに応じて非常に高速な作業になります。それぞれに 1000 行しかない場合、10 億通りの結果が得られます。これが非常に遅い理由です。

このような巨大なデカルト積を作成しないようにするには、最初にフィルタリングを行う必要があります。デカルト積を作成するa.@Field1 = "pippo" に条件を移動すると、パフォーマンスが大幅に向上します。

たとえば、最初の XML ファイルで "pippo" に一致する行が 10 行しかない場合、考えられる結果は 10*1000*1000 = 1000 万になります。現在のクエリ。

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 に答える