0

必要なフィールドを解析して収集し、そこからオブジェクトを構築するパーサーがあります。xmlが以下のようなものであるとします

<xml>
<p1>
...
...
</p1>
<p2>
...
</p2>
...
...
</xml>

私のJavaコードはそれを解析し、コードは以下のようになります。

for each product //p1,p2 etc..
 print start time
 parse that node, which returns a object
 print end time
 add the object to list.

サンプルコードは以下

products = (NodeList) xPath.evaluate("/xml/product",pxml,XPathConstants.NODESET);
for (int i = 0; i < products.getLength(); i++)
            {
                System.out.println("parsing product ::"+i+":" + (System.currentTimeMillis()-time));
                BookDataInfo _parsedPoduct = ParseProduct(products.item(i));
                System.out.println("parsing product finished ::"+i+":" + (System.currentTimeMillis()-time));
                if (_parsedPoduct.getParsingSucceeded())
                {
                    pparsedProducts.add(_parsedPoduct);
                }
            }

ノードを解析する前に時間を出力しました。その後、最初の製品の場合は 100 ミリ秒かかり、300 番目の製品は 2000 ミリ秒かかるなど、製品の数に応じて時間は指数関数的に増加します。いずれの場合も、コードの同じ部分が解析のために実行されます。なぜそれが起こるのか誰にも分かりますか?

parseproduct が行っているコードを投稿することはできませんが、時間が最も費やされている場所がわかりました。

private NodeList getNodelist(Node xml, String Name)
{
    long time = System.currentTimeMillis();
    System.out.println("Nodelist start::" + (System.currentTimeMillis() - time));
    NodeList nodes = (NodeList)xPath.evaluate(Name,xml,XPathConstants.NODESET);
    System.out.println("Nodelist end::" + (System.currentTimeMillis() - time));
    return nodes;
}

stmt Node node = (Node)xPath.evaluate(Name,xml,XPathConstants.NODE); でノード値を取得する場合も同様です。

ここで、xPath は XPath 型の静的オブジェクトです。製品に対して上記の関数が複数回呼び出されると、後の呼び出しには多くの時間がかかります。たとえば、最初は 2/3 ミリ秒かかりましたが、後で (製品 300 など) 呼び出しごとに 55 ~ 60 ミリ秒かかりました。

ここで何か足りないことがありますか?ありがとう!

4

2 に答える 2

0

DOM と SAX 解析の違いを確認してください。DOM では XML ファイルをクエリできますが、そのためにはドキュメント全体をメモリにアップロードする必要があります。オブジェクトを作成するだけの場合は、SAX パーサーを使用することをお勧めします。

于 2013-11-07T07:28:25.323 に答える