XmlDocument와 XmlReader를 사용할시기 결정
사용자 정의 개체-> XML 직렬화 유틸리티를 최적화하고 있으며 모두 완료되고 작동하며 문제가 아닙니다.
파일을 XmlDocument
객체 에로드 한 다음 모든 자식 노드를 재귀 적으로 통과하는 방식으로 작동했습니다.
전체 XmlReader
를 XmlDocument
로드 / 파싱하는 대신 사용 하는 것이 더 빠를 것이라고 생각했기 때문에 해당 버전도 구현했습니다.
알고리즘은 정확히 동일하며 래퍼 클래스를 사용 XmlNode
하여 XmlReader
. 예를 들어 GetChildren
yield 메서드는 자식 XmlNode
또는 SubTree를 반환합니다 XmlReader
.
그래서 저는 두 버전을 테스트하기 위해 테스트 드라이버를 작성하고 중요하지 않은 데이터 세트 (약 1,350 개의 요소가있는 900kb XML 파일)를 사용했습니다.
그러나 JetBrains dotTRACE를 사용하면 XmlReader
버전이 실제로 XmlDocument
버전 보다 느립니다 ! XmlReader
자식 노드를 반복 할 때 읽기 호출 과 관련된 몇 가지 중요한 처리가있는 것 같습니다 .
그래서 나는 이것을 묻기 위해 모든 것을 말합니다.
XmlDocument
및 의 장점 / 단점은 XmlReader
무엇이며 어떤 상황에서 사용해야합니까?
내 생각에 파일 크기 임계 값 XmlReader
은 성능면에서 더 경제적 일뿐만 아니라 메모리 집약적이지 않다는 것입니다 . 그러나이 임계 값은 1MB 이상인 것 같습니다.
나는 ReadSubTree
매번 자식 노드를 처리하기 위해 전화 하고 있습니다.
public override IEnumerable<IXmlSourceProvider> GetChildren ()
{
XmlReader xr = myXmlSource.ReadSubtree ();
// skip past the current element
xr.Read ();
while (xr.Read ())
{
if (xr.NodeType != XmlNodeType.Element) continue;
yield return new XmlReaderXmlSourceProvider (xr);
}
}
이 테스트는 단일 레벨 (예 : 넓고 얕은)에서 많은 객체에 적용됩니다.하지만 XmlReader
XML이 깊고 넓을 때 얼마나 좋은지 궁금합니다 . 즉, 내가 다루는 XML은 데이터 객체 모델, 많은 자식 객체에 대한 하나의 부모 객체 등과 매우 유사합니다.1..M..M..M
또한 구문 분석중인 XML의 구조를 미리 알지 못하기 때문에 최적화 할 수 없습니다.
저는 일반적으로 가장 빠른 관점 이 아니라 메모리 활용 관점 에서 살펴 보았습니다 . 모든 구현은 내가 사용한 사용 시나리오 (일반적인 엔터프라이즈 통합)에 충분히 빠릅니다.
그러나 내가 실패한 곳, 때로는 훌륭하게 작업하는 XML의 일반적인 크기를 고려하지 않습니다. 미리 생각하면 슬픔을 덜어 줄 수 있습니다.
XML은 적어도 XmlDocument
또는 같은 DOM 리더를 사용하여 메모리에로드 될 때 팽창하는 경향이 XPathDocument
있습니다. 10 : 1 같은 거요? 정확한 양은 정량화하기 어렵지만, 예를 들어 디스크가 1MB이면 메모리가 10MB 이상이됩니다.
전체 문서를 전체적으로 메모리에로드하는 모든 판독기를 사용하는 프로세스 ( XmlDocument
/ XPathDocument
)는 큰 개체 힙 조각화로 인해 궁극적으로 OutOfMemoryException
s (사용 가능한 메모리 포함)로 이어질 수있어 서비스 / 프로세스를 사용할 수 없게됩니다.
크기가 85K보다 큰 객체는 결국 큰 객체 힙에 들어가고 DOM 리더를 사용하면 10 : 1 크기가 급증하므로 XML 문서가 할당되기 전에 많은 시간이 걸리지 않음을 알 수 있습니다. 큰 개체 힙.
XmlDocument
사용하기 매우 쉽습니다. 유일한 단점은 전체 XML 문서를 메모리에로드하여 처리한다는 것입니다. 사용하기 매우 간단합니다.
XmlReader
스트림 기반 리더이므로 프로세스 메모리 사용률을 일반적으로 평평하게 유지하지만 사용하기가 더 어렵습니다.
XPathDocument
XmlDocument의 더 빠르고 읽기 전용 버전 인 경향이 있지만 여전히 메모리 '부풀림'이 있습니다.
XmlDocument는 전체 XML 문서의 메모리 내 표현입니다. 따라서 문서가 크면 XmlReader를 사용하여 읽었을 때보 다 훨씬 많은 메모리를 사용합니다.
이것은 XmlReader를 사용할 때 요소를 하나씩 읽고 처리 한 다음 폐기한다고 가정합니다. XmlReader를 사용하고 메모리에 다른 중간 구조를 구성하면 동일한 문제가 발생하고 그 목적을 무너 뜨리는 것입니다.
두 가지 XML 처리 모델의 차이점에 대해 자세히 알아 보려면 Google에서 " SAX 대 DOM "을 참조하세요.
또 다른 고려 사항은 XMLReader가 완벽하지 않은 형식의 XML을 처리하는 데 더 강력 할 수 있다는 것입니다. 최근에 XML 스트림을 사용하는 클라이언트를 만들었지 만 스트림에는 일부 요소에 포함 된 URI에서 올바르게 이스케이프 된 특수 문자가 없습니다. XMLDocument와 XPathDocument는 XML로드를 전혀 거부했지만 XMLReader를 사용하여 스트림에서 필요한 정보를 추출 할 수있었습니다.
XmlDocument가 느려지고 결국 사용할 수 없게되는 크기 임계 값이 있습니다. 그러나 임계 값의 실제 값은 응용 프로그램 및 XML 콘텐츠에 따라 달라 지므로 엄격하고 빠른 규칙이 없습니다.
XML 파일에 큰 목록 (예 : 수만 개의 요소)이 포함될 수 있다면 XmlReader를 사용해야합니다.
인코딩 차이는 두 개의 다른 측정이 혼합되기 때문입니다. UTF-32는 문자 당 4 바이트가 필요하며 본질적으로 1 바이트 데이터보다 느립니다.
대형 (100K) 요소 테스트를 살펴보면 사용 된 하중 방법에 관계없이 각 케이스마다 시간이 약 70mS 씩 증가하는 것을 알 수 있습니다.
이것은 특히 캐릭터 당 오버 헤드로 인해 발생하는 (거의) 일정한 차이입니다.
참고 URL : https://stackoverflow.com/questions/1505075/deciding-on-when-to-use-xmldocument-vs-xmlreader
'IT Share you' 카테고리의 다른 글
데이터베이스 열을 인덱싱하는 방법 (0) | 2020.12.01 |
---|---|
Java에서 "new String (…)"이라는 표현의 목적은 무엇입니까? (0) | 2020.12.01 |
내 Haskell 프로그램이나 라이브러리가 버전 번호를 어떻게 찾을 수 있습니까? (0) | 2020.12.01 |
패턴 매칭과 가드의 차이점은 무엇입니까? (0) | 2020.12.01 |
C #의 사전 및 사후 증가 (0) | 2020.12.01 |