3

GPX ファイルを操作するアプリケーションを作成していますが、QDomElement クラスを使用して大きな XML ドキュメントを読み取るときにパフォーマンスの問題が発生します。何千ものウェイポイントを含む GPS パスを含むファイルは、読み込みに 30 分かかる場合があります。

これは、パス (ルートまたはトラック) を読み取るための私のコードです。

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);
        }
    }
}

Apple の Instruments でコードを分析すると、QDomNodeListPrivate::createList() が計算時間の大部分を占めており、QDomNodeList::count() と QDomNodeList::item() の両方によって呼び出されていることに気付きました。

リストは操作ごとに再生成されるように見えるため、これは QDomElement の子要素を反復処理する効率的な方法ではないようです。代わりにどのアプローチを使用する必要がありますか?

4

2 に答える 2

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 を使えばもっと速くできるかもしれませんが、今のところはこれで十分です。

于 2012-10-23T19:17:07.777 に答える
0

DOMの代わりにQTSAXの使用を検討する必要があります。SAXパーサーは通常、XMLドキュメント全体をメモリにロードせず、次のような場合に役立ちます。

于 2012-07-21T19:07:50.767 に答える