2009-08-30 5 views
0

再利用の前にMSXML2.DOMDocumentオブジェクトの以前の内容を迅速に消去する方法はありますか?私はそれらを破棄し、毎回新しいインスタンスを作成する習慣を持っていましたが、これは無駄なものとして私を襲って、いくつかのテストケースがこれを確認するように見えます。速くクリアなMSXMLドキュメントまたは再作成?

この場合、移植性のためにMSXML 3.0を使用しています。この古いバージョンには、XPathを使用して大きなノードセットを選択する際にいくつかの欠点があります。ドキュメントツリー全体を選択して削除しようとすると、きれいに感じられず、速く実行されません。以前は、MSXML 3.0およびそれ以前のバージョンでは、SelectNodesメソッドを呼び出すことによって作成された選択オブジェクトが徐々にリンパ節転移が計算されます

selectNodes Method

:「怠惰な選択」MSXML 3.0用途は自信のいずれかを鼓舞しません。セット。 DOMツリーが変更された場合、selectNodes呼び出しがその内容を積極的に反復している間に、選択または返されたノードが変更される可能性があります。 MSXML 4.0以降では、ノードセットの結果は選択時に完全に計算されます。これにより、反復が簡単で予測可能であることが保証されます。まれに、この変更は以前の動作に対応するために作成されたレガシーコードに影響する可能性があります。

このようなオブジェクトを再利用するには、使用の間に残っている可能性のあるさまざまなプロパティ(SelectionLanguageなど)の現在の設定を考慮する必要があります。私はそれが大きな問題ではないはずだと思います。特に、再利用は常に同じパターンに従っています。

ロードされたDOMをクリアして再利用するためのきれいで速い方法、または再利用の選択肢よりも悪い可能性がある理由を入力したとします。

+1

私はMSXMLではありませんが、Document-> putref_documentElement(新しく構築された空のルート要素)を呼び出すか、Document-> load(別のXMLソースへのポインタを使用して)を呼び出そうとしましたか? – reuben

+0

私はコードでドキュメントを構築しているので読み込みには役立ちませんが、他のアイデアは試してみる価値があります。ありがとう!ほとんど明らかだが、私はそれを試していないかもしれない。 – Bob77

+1

ルート要素を置き換えることは、そのトリックを行うようです。あまりにもこれは答えとして提案されていない悪い、私はそれを受け入れるだろう。 – Bob77

答えて

2

あなたはMSXML6に移行を検討可能性がありますすべての

  1. まず、MSXML6はWinXPのSP3、Vistaでは、Windows Server 2008の 、Win7のおよびWindows Server 2008 R2で-ボックスです。マイクロソフトが をサポートしている唯一のOSは、バンド内のMSXML6を持たないWindows 2003で、 にMSIをダウンロードさせる必要があります。全体として、MSXML6はMSXML3とほぼ同じくらいポータブルな です。
  2. XSLパターンとXPathの両方をサポートするMSXML3とは異なり、MSXML6はXPathのみをサポートしています.SelectNodesとSelectSingleNodeはスナップショットのコンテキストでのみ動作します。
  3. GetElementsByTagNameとは異なり、スナップショットのセマンティクスはW3Cによって定義されています。 MSXML6のパフォーマンスとW3C準拠性が向上しました。

MSXMLを使用して、ドキュメント要素を交換するときにメモリを取り戻すないだろうという意味、内部Garbage Collectionを持っているとしても、あなたは、各使用後に文書をクリーンアップについてはあまり気にしてはいけません。私のアドバイスは、具体的なクレンジングの努力で平和を保ち、次のロードのためにインスタンスを再利用するか、DOM APIを使ってツリーを再構築することです。メモリ使用量が本当に大きな問題であれば、XmlLiteはあなたに完全な制御を与えることができます。

+0

MSXML 6に関するあなたの意見はうまくいきますが、私のターゲットPCベースの中にはまだWin2KとWin9Xシステムがたくさんあります。限り、 "ガベージコレクション"に行く私はあなたが間違っていると思う。 MSXML DOMはCOMベースですので、.NetやJavaで作成されたものとは異なり、クリーンアップは便利で効果的です。しかし、逆の証拠があれば、私はリンクを感謝します。 – Bob77

+0

クイックベンチマークを試みましたが、魔法のクリーンアップはありません。しかし、チェックすると即座にメモリの一部だけが再利用されるため、「遅延クリーンアップ」があります。オーバーヘッドを本当にクリアするということは、オブジェクトを完全に解放することを意味し、.loadXML( "")でさえそれをすべて取り戻すことはできません。クリーンアップのポイントは、大きな文書を読み込んで使用してから長時間(数分または数時間)待ってから別の文書を必要とすることです。あるいは、ミリ秒単位で別の文書を作成することもできます。何百ものクライアントがいるかもしれないサーバーサイドのコードを書いているときに、それはすべて追加されます。 – Bob77

+0

あなたは今どこにいるのですか? MSXMLは、リンクを貼り付けたので、内部的にGCを持つCOMです。これはVisual J ++に戻って長い話です。とにかく、プラットフォームとクリーンアップ戦略の両方で適切なソリューションを選択するのに役立つ情報を提供します。私は投票に値するとは思わない。 –

関連する問題