代码之家  ›  专栏  ›  技术社区  ›  csgillespie Carl Witthoft

在R中创建大型XML树

  •  1
  • csgillespie Carl Witthoft  · 技术社区  · 14 年前

    我试图在R中创建一个大型XML树。下面是代码的简化版本:

    library(XML)
    N = 100000#In practice is larger  10^8/ 10^9
    seq = newXMLNode("sequence")
    pars = as.character(1:N)
    for(i in 1:N)
        newXMLNode("Parameter", parent=seq, attrs=c(id=pars[i]))
    

    当n约为n^6时,这大约需要一分钟,n^7大约需要四十分钟。有没有办法加快速度?

    使用“粘贴”命令:

    par_tmp = paste('<Parameter id="', pars, '"/>', sep="")
    

    不到一秒钟。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Shane    14 年前

    我建议使用 Rprof profr 包裹。这将向您展示您的瓶颈所在,然后您可以考虑如何优化函数或更改您使用它的方式。

    你的 paste 例子会更快,部分原因是它是矢量化的。为了进行更公平的比较,您可以通过循环查看其中的差异。 粘贴 就像你现在做的那样 newXMLNode 看看时间的不同。

    编辑:

    下面是分析循环的输出 普罗尔 .

    library(profr)
    xml.prof <- profr(for(i in 1:N) 
        newXMLNode("Parameter", parent=seq, attrs=c(id=pars[i])))
    plot(xml.prof)
    

    在这里,没有什么特别明显的地方可以改善这一点。我看到它在 %in% 函数,因此改进会稍微减少总时间(尽管您仍然需要重复此过程,因此不会产生很大的差异)。最好的解决办法是重写 新节点 作为一个矢量化函数,您可以跳过 for 完全循环。 alt text http://i42.tinypic.com/5x26gw.jpg