문제

실제로는 매우 큰 트리 구조의 이미지인 xml 파일을 구문 분석해야 하므로 XmlReader 클래스를 사용하여 '즉시' 트리를 채웁니다.각 노드는 ReadSubtree() 함수를 통해 상위 노드로부터 예상되는 XML 청크만 전달됩니다.이는 노드가 모든 하위 노드를 소비하는 시점에 대해 걱정할 필요가 없다는 장점이 있습니다.하지만 이제 이것이 실제로 좋은 생각인지 궁금합니다. 수천 개의 노드가 있을 수 있고 .NET 소스 파일을 읽는 동안 ReadSubtree 호출마다 두어 개(아마도 그 이상)의 새 개체가 생성된다는 사실을 발견했기 때문입니다. 재사용 가능한 객체에 대한 캐싱은 이루어지지 않습니다(제가 본 것입니다).

어쩌면 ReadSubtree()가 대량으로 사용될 것이라고 생각되지 않았을 수도 있고, 아니면 그냥 아무것도 걱정하지 않고 파일을 구문 분석한 후 GC.Collect()를 호출하면 될 수도 있습니다.

누군가가 이것에 대해 밝힐 수 있기를 바랍니다.

미리 감사드립니다.

업데이트:

훌륭하고 통찰력 있는 답변에 감사드립니다.

.NET 소스 코드를 자세히 살펴보니 처음 생각했던 것보다 더 복잡하다는 것을 알게 되었습니다.나는 마침내 바로 이 시나리오에서 이 함수를 호출한다는 생각을 포기했습니다.Stefan이 지적했듯이 xml 리더는 외부인에게 절대 전달되지 않으며 xml 스트림을 구문 분석하는 코드(직접 작성함)를 신뢰할 수 있으므로 각 노드가 데이터 양을 책임지도록 강제하고 싶습니다. 코드 몇 줄만 저장하기 위해 그다지 얇지 않은 ReadSubtree() 함수를 사용하는 것보다 스트림에서 훔치는 것이 좋습니다.

도움이 되었습니까?

해결책

ReadSubTree()는 원본 XmlReader를 래핑하는 XmlReader를 제공합니다.이 새로운 리더는 소비자에게 완전한 문서로 나타납니다.하위 트리를 전달하는 코드가 독립형 XML 문서를 가져오고 있다고 생각하는 경우 이는 중요할 수 있습니다.예를 들어 새 판독기의 Depth 속성은 0에서 시작합니다.이는 매우 얇은 래퍼이므로 원래 XmlReader를 직접 사용한 경우보다 더 많은 리소스를 사용하지 않을 것입니다. 제공한 예에서는 실제로 하위 트리에서 많은 것을 얻지 못할 가능성이 높습니다. 리더.

귀하의 경우 가장 큰 장점은 하위 트리 판독기가 실수로 하위 트리를 지나 읽을 수 없다는 것입니다.하위 트리 판독기는 그다지 비싸지 않기 때문에 그 안전성이면 충분할 수 있습니다. 그러나 일반적으로 하위 트리가 문서처럼 보이도록 해야 하거나 자체 하위 트리만 읽는 코드를 신뢰하지 않는 경우에 더 유용합니다.

Will이 언급했듯이 GC.Collect()를 호출하고 싶지 않을 것입니다.결코 성능이 향상되지 않습니다.

다른 팁

모든 개체가 대형 개체 힙(즉, 85k 미만)이 아닌 일반 관리되는 힙에서 생성된다고 가정하면 여기서는 실제로 문제가 없어야 합니다. 이것이 바로 GC가 처리하도록 설계된 것입니다.

프로세스 마지막에 GC.Collect를 호출할 필요도 없다는 점을 제안하고 싶습니다. 거의 모든 경우에 GC가 수집 일정을 예약하도록 허용하면 최적의 방식으로 작동할 수 있기 때문입니다(참조: 이 블로그 게시물 내가 할 수 있는 것보다 훨씬 더 잘 설명하는 GC에 대한 매우 자세한 설명을 원합니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top