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 이상에서는 노드 집합 결과가 선택 시점에 완전히 계산됩니다. 이렇게하면 반복이 간단하고 예측 가능합니다. 드문 경우이 변경은 이전 동작을 수용하도록 작성된 레거시 코드에 영향을 줄 수 있습니다.

I는 또한 객체를 재사용하는 용도 사이에 머무르게 할 수 상이한 특성 (SelectionLanguage 등)의 현재 설정을 염두에 요구되는 실현. 나는 그것이 큰 거래는 아니어야한다고 생각한다. 특히 재사용이 항상 같은 패턴을 따른다면 더욱 그렇다.

로드 된 DOM을 지우고 재사용 할 수있는 깨끗하고 빠른 방법이라고 생각합니다. 재사용이 레크리에이션의 대안보다 더 나쁜 이유는 무엇입니까?

+1

나는 MSXML이 아니지만 Document-> putref_documentElement (새로 생성 된 빈 루트 요소와 함께) 또는 Document-> load (다른 XML 소스에 대한 포인터를 사용하여)를 호출 해 보았습니까? – reuben

+0

로딩은 코드에서 문서를 구성하는 데 도움이되지 않지만 다른 아이디어는 시도해 볼 가치가 있습니다. 감사! 거의 명백하게 보이지만 어쩌면 시도하지 않은 것일 수 있습니다. – Bob77

+1

루트 요소를 바꾸는 것이 트릭을 수행하는 것 같습니다.너무 나쁘다 이것은 대답으로 제안되지 않았다, 나는 그것을 받아 들일 것이다. – Bob77

답변

2

당신은 MSXML6으로 마이그레이션 고려할 수 있습니다 : 모든

  1. 첫째, MSXML6는 인 - 더 - 박스 WINXP SP3, 비스타, 윈도우와 서버 2008, Win7에 및 Windows Server 2008 R2. Microsoft에서 을 지원하는 유일한 OS는 밴드에서 MSXML6을 가지고 있지 않으므로 고객이 MSI를 다운로드하도록 허용해야하는 Windows 2003입니다. 전반적으로 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 ++에 대한 긴 이야기였습니다. 어쨌든, 나는 플랫폼 및 정리 전략에서 올바른 솔루션을 선택하는 데 도움이되는 정보 만 제공합니다. 나는 투표 할 가치가 있다고 생각하지 않는다. –

관련 문제