0

50 000 回以上発生するイベントがあります。このイベントが発生するたびに、xml ファイルを調べてデータを取得する必要があります。この xml ファイルには、20,000 を超える可能な値があります。

XML を読み取る前に、50 000 イベントの他の作業は非常に高速でした。xml 読み取りを実装するとすぐに、操作全体が大幅に遅くなりました。

XMLを読むために、私はこれをやっています:

 XElement xelement = XElement.Load(SomePath);

        IEnumerable<XElement> elements = xelement.Elements();

        foreach (var element in elements)
        {
            if (element.Element("SomeNode") == value)
            {
                valueToSet = element.Element("SomeOtherNode").Value
                break;
            }
        }

これを最適化するにはどうすればよいですか?

4

2 に答える 2

1

ファイルを一度ロードし、前処理してからDictionary<string, String>、イベントが発生するたびにその辞書でルックアップを実行する必要があるように思えます。ディクショナリをどこにキャッシュするかを正確に示すのに十分なコンテキストが提供されていませんが、それは特に難しいことではありません。

辞書の読み込みと変換は非常に簡単です。

var dictionary = XElement.Load(SomePath)
                         .Elements()
                         .ToDictionary(x => x.Element("SomeNode").Value,
                                       x => x.Element("SomeOtherNode").Value);

SomeNodeこれは、すべての二次要素に要素と要素の両方が含まれていることを前提としていSomeOtherNodeます...そうでない場合は、最初にフィルタリングを行う必要があります。

于 2013-07-05T17:04:06.140 に答える
0

毎回 (更新された?) ファイルを常にロードする必要がある場合は、(XElement.load のように) ドキュメント全体を事前にロードする必要がないように、 XStreamingElementを検討することをお勧めします。XElement.Load を使用すると、XML 全体をメモリに読み込み、それを反復処理します。XStreaminigElement を使用すると、必要な量のドキュメントのみをメモリに取り込みます。さらに、最初の一致を取得するには、.FirstOrDefault を使用します。

ドキュメントを常に更新する必要がない場合は、@jonskeet が提供するようなキャッシュ メカニズムを検討してください。

于 2013-07-05T17:22:47.387 に答える