【问题标题】:slow construction of tree structure from XML从 XML 构建树结构缓慢
【发布时间】:2010-11-11 08:09:35
【问题描述】:

我正在将一个 XML 文档解析为我自己的结构,但是对于大型输入,构建它的速度非常慢,有没有更好的方法来做到这一点?

public static DomTree<String> createTreeInstance(String path) 
  throws ParserConfigurationException, SAXException, IOException {
    DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = docBuilderFactory.newDocumentBuilder();
    File f = new File(path);
    Document doc = db.parse(f);       
    Node node = doc.getDocumentElement(); 
    DomTree<String> tree = new DomTree<String>(node);
    return tree;
}

这是我的 DomTree 构造函数:

    /**
     * Recursively builds a tree structure from a DOM object.
     * @param root
     */
    public DomTree(Node root){      
        node = root;        
        NodeList children = root.getChildNodes();
        DomTree<String> child = null;
        for(int i = 0; i < children.getLength(); i++){  
            child = new DomTree<String>(children.item(i));
            if (children.item(i).getNodeType() != Node.TEXT_NODE){
                super.children.add(child);
            }
        }
    }

更新:

我使用 100MB XML 文件对 createTreeInstance() 方法进行了基准测试:

  • 正在创建 docBuilderFactory... 完成 [3ms]
  • 正在创建 docBuilder... 完成 [21 毫秒]
  • 正在解析文件...完成 [5646ms]
  • getDocumentElement... 完成 [1 毫秒]
  • 正在创建 DomTree... 完成 [17076ms]

更新:

正如 John Doe 下面建议的那样,使用 SAX 可能更合适 - 我以前从未使用过 SAX,那么有没有一种好方法可以将我必须使用的内容转换为使用 SAX?

【问题讨论】:

    标签: java xml optimization parsing tree


    【解决方案1】:

    您是否尝试过对此进行分析?我认为这可能比查看代码更有启发性。经常会出现您通常从未预料到的瓶颈。一个简单的配置文件(您可以在代码中轻松完成)是计算 DOM 解析与树构建的时间。

    如需更深入的分析,JProfiler 可作为评估版使用。其他人也许可以推荐更合适的东西。

    【讨论】:

    • 我只对正在使用它的较大程序进行了基准测试,它表明这个过程是一个瓶颈
    • 所以我肯定会看看 DOM 解析与你的树构建
    • 正在创建 docBuilderFactory... 完成 [3ms] 创建 docBuilder... 完成 [21ms] 解析文件... 完成 [5646ms] getDocumentElement... 完成 [1ms] 创建 DomTree... 完成 [ 17076ms]
    • 如果您正在加载一个 100Mb 的文档,那么您的内存可能是个问题。尝试使用 -Xmx512m 增加 VM 最大内存大小(最多分配 512m,或使用任何可以使用的数字)
    • 啊。刚刚从我的答案中删除了它。谢谢
    【解决方案2】:

    如果您要解析大型 XML,则不要使用 DOM,而是使用 SAX、诸如 XPP3 之类的拉式解析器或其他任何东西。

    问题是您不会在内存中拥有一个“XML 树”,这可能很方便,您只能获取事件并相应地处理它们。然而,这将是内存方面的,您可以将元素映射到您的数据结构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-20
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      相关资源
      最近更新 更多