2012-02-05 3 views
0

저는 전화로 애플리케이션을 가지고 있으며 약 50 페이지의 XML을 취하는데 각 XML에는 약 100 개의 고개가 있습니다. 그래서 당신이 약 5000 개의 노드 인 수학을한다면 파싱 할 것입니다. 때때로 이러한 노드가 동일하게 설정되지 않습니다. 예 : 어쩌면 75 %가 다른 25 %와 다른 스키마를 가지고 있으므로이를 처리하고 다르게 파싱하는 코드가 있습니다.WP7의 XML 성능 최적화를위한 팁

http 호출을 최적화 할 수 없다면 웹 서비스는 한 번에 100 개의 "항목"만 제공하므로 기본적으로 웹 서비스를 50 번 눌러 모든 페이지를 가져와야합니다. 데이터. 다음은 높은 수준의 프로세스입니다.

 
Call web service (webclient) 
Parse XML (take note total pages in xml. it will say Page 1 of 100) 
Add results to collection 
Call web service again for page 2 
Parse 
Add results to collection 
....rinse and repeat 100 times.

구문 분석 코드는 실제로 내가 최적화 할 수있는 유일한 장소입니다. 내가하고있는 일은 linq을 사용하여 XML을 구문 분석하고 IEnumerable의 노드를 분리 한 다음 구문을 분석하여 내가 만든 사용자 정의 객체에 배치하는 것입니다. 이 전체 프로세스를 최적화하는 방법에 대한 몇 가지 고차원적인 아이디어를 찾고 있습니다. 어쩌면 내가 뭔가를 놓친 것 같아.

일부 코드는 단지 1000 번 이상을 상상해보십시오. 속성이 많을수록 작은 예입니다. 대부분 구문 분석이 필요한 30 가지 특성이 있습니다. 또한 실제 스키마에 액세스 할 수 없으며 스키마 변경을 제어 할 수 없습니다.

XElement eventData = XElement.Parse(e.Result); 
IEnumerable<XElement> feed = 
    (eventData.Element("results").Elements("event").Select(el => el)).Distinct(); 
foreach (XElement el in feed) 
{ 
    _brokenItem = el.ToString(); 
    thisFeeditem.InternalGuid = Guid.NewGuid().ToString(); 
    thisFeeditem.ServiceIcon = GetServiceIcon(thisFeeditem.ServiceType); 
    thisFeeditem.Description = el.Attribute("displayName").Value; 
    thisFeeditem.EventURL = el.Attribute("uri").Value; 
    thisFeeditem.Guid = el.Attribute("id").Value; 
    thisFeeditem.Latitude = el.Element("venue").Attribute("lat").Value; 
    thisFeeditem.Longitude = el.Element("venue").Attribute("lng").Value; 
} 
+0

맨 위에는 두 가지 질문이 있습니다. (1) 이것은 호출 될 때마다 다른 서비스에서 가져 오는 XML이거나 아무것도 변경되지 않는 시간입니다. (2) 서비스의 행동? –

+1

코드 샘플을 분석하면 도움이됩니다. –

+0

집에 도착했을 때 질문에 답할 때 몇 가지 코드를 추가하겠습니다. 나는 그 서비스에 대한 통제권이 없다. 나는 페이징 된 버전보다 거대한 단일 XML을 선호한다. API가 페이징 웹 페이지가 아닌 뚱뚱한 클라이언트 용으로 설계되었다는 느낌이 들었습니다. 둘째, 모든 페이지에서 결과가 다릅니다. – firebellys

답변

2

코드를 보지 않고도 코드를 최적화하는 것은 쉽지 않습니다. 그러나 고려해야 할 한 가지 일반적인 점이 있습니다 :

Linq-to-XML은 전체 XML 문서를 메모리에 상주하는 모델로 읽는다는 점에서 DOM 기반 파서입니다. 모든 쿼리는 DOM에 대해 실행됩니다. 대용량 문서의 경우 DOM을 구성하는 것이 메모리와 CPU를 많이 사용할 수 있습니다. 또한 Linq-to-XML 쿼리를 비효율적으로 작성하면 동일한 트리 노드를 여러 번 탐색 할 수 있습니다.

대신에 XmlReader과 같은 직렬 파서를 사용하는 것이 좋습니다. 이 유형의 파서는 문서의 메모리 기반 모델을 만들지 않으며 앞으로 만 작동하므로 각 요소를 한 번만 읽을 수 있습니다.

0

아키텍처를 변경할 수 있습니다.

XML 데이터의 수집 및 필터링을 수행하는 웹 서비스를 만들고 전화기에서 해당 웹 서비스의 데이터를 검색합니다.

이렇게하면 무거운 처리를 (확장 가능한 ?!) 서버로 옮기고 모든 클라이언트를 업데이트하지 않고 XML 소스가 변경 될 때만 서비스를 수정하면됩니다.

결과를 캐시하고 중복을 방지 할 수도 있습니다.

이제 휴대 전화에서 일어나는 일을 완전히 제어 할 수 있습니다.

+0

이것은 현재 먼 수평선에 있습니다. 나는 Azure 버전의 코드로 전화를 걸고 하나의 청크 (압축 어쩌면)에서 응답을 기다립니다. 하늘색 서버가 XML을 빠르게 처리하고 캐싱을 더 잘 처리 할 수 ​​있다고 생각합니다. – firebellys