首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析xml,时间呈指数增长

解析xml,时间呈指数增长
EN

Stack Overflow用户
提问于 2013-11-07 07:20:00
回答 2查看 452关注 0票数 0

我有一个解析器,它解析和收集所需的字段,并从其中构造一个对象。假设xml如下所示

代码语言:javascript
复制
<xml>
<p1>
...
...
</p1>
<p2>
...
</p2>
...
...
</xml>

我的java代码解析它,代码如下所示。

代码语言:javascript
复制
for each product //p1,p2 etc..
 print start time
 parse that node, which returns a object
 print end time
 add the object to list.

示例代码如下

代码语言:javascript
复制
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);
                }
            }

我已经打印了解析节点之前的时间,在那之后,随着no.of产品的成倍增长,比如第一种产品需要100 as,当第300位产品花费2000 as时,时间就会呈指数增长。在每种情况下,都会执行相同部分的代码进行解析。有人知道为什么会发生这种事吗?

我不能发布parseproduct正在做的代码,但是可以找到时间消耗最多的地方。

代码语言:javascript
复制
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 )xPath.evaluate(Name,xml,XPathConstants.NODE)处获取节点值;

这里,XPath是xPath类型的静态对象。当对一个产品多次调用上述函数时,后面的调用会花费很长时间,比如在开始时需要2/3 ms,但是稍后(例如产品300),每次调用需要55-60ms。

我可以在这里漏掉一些东西吗?谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-08 11:09:40

问题解决了。主要问题是在下面的链接中提到的问题。XPath.evaluate performance slows down (absurdly) over multiple calls

按照上面提到的步骤,它大大减少了所消耗的时间。

票数 0
EN

Stack Overflow用户

发布于 2013-11-07 07:28:25

检查DOM和SAX解析之间的区别,DOM允许您查询XML文件,但必须将整个文档上传到内存中,如果您只想创建对象,最好使用SAX解析器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19830080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档