2012-07-21 8 views
2

GPX files으로 작업하기위한 응용 프로그램을 작성 중이며 QDomElement 클래스를 사용하여 큰 XML 문서를 읽을 때 성능 문제가 있습니다. 수천 개의 웨이 포인트가 포함 된 GPS 경로가있는 파일은로드하는 데 30 분 정도 걸릴 수 있습니다. Qt QDomElement 성능 문제

void GPXPath::readXml(QDomElement &pathElement) 
{ 
    for (int i = 0; i < pathElement.childNodes().count(); ++i) 
    { 
     QDomElement child = pathElement.childNodes().item(i).toElement(); 
     if (child.nodeName() == "trkpt" || 
      child.nodeName() == "rtept") 
     { 
      GPXWaypoint wpt; 
      wpt.readXml(child); 
      waypoints_.append(wpt); 
     } 
    } 
} 

애플의 악기와 코드 분석 내가 QDomNodeListPrivate :: createList()가 컴퓨팅 대부분의 시간과에 대한 책임이 있음을 발견 할 때 :

이는 경로 (경로 나 트랙)를 읽어 내 코드입니다 QDomNodeList :: count()와 QDomNodeList :: item() 모두에 의해 호출됩니다.

QDomElement의 자식 요소를 반복하는 효율적인 방법은 아니지만 모든 작업에 대해 목록이 다시 생성되는 것처럼 보입니다. 대신 어떤 접근 방식을 사용해야합니까?

답변

3

내가이 대신

void GPXPath::readXml(QDomElement &pathElement) 
{ 
    QDomElement child = pathElement.firstChildElement(); 
    while (!child.isNull()) 
    { 
     if (child.nodeName() == "trkpt" || 
      child.nodeName() == "rtept") 
     { 
      GPXWaypoint wpt; 
      wpt.readXml(child); 
      waypoints_.append(wpt); 
     } 
     child = child.nextSiblingElement(); 
    } 
} 

이 더 빨리 요인 15 밝혀 노력과 같은 경우에 유용하지 않습니다. SAX를 사용하여 더 빨리 수행 할 수도 있지만, 지금은 그렇게 할 것입니다.

+0

이것이 내 앱에서도 위대한 개선 사항임을 확인할 수 있습니다. 나는 10 초에서 2 초의 파싱 시간을 보냈다. 당신이 말했듯이 문제는 QDomNodeListPrivate :: createList()를 호출하는 QDomNodeList :: count() 메서드입니다 ... 매우 느립니다. – mrAlmond

0

DOM 대신 QT SAX을 사용해야합니다. SAX 파서는 일반적으로 메모리에 전체 XML 문서를로드하고 당신