在R中创建大型XML树

时间:2010-03-19 11:53:44

标签: xml r performance

我正在尝试在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 个答案:

答案 0 :(得分:1)

我建议使用Rprofprofr包来分析该功能。这将显示您的瓶颈在哪里,然后您可以考虑如何优化功能或改变您使用它的方式。

你的paste示例会更快,部分原因是它的矢量化。为了更公平地比较,您可以通过循环paste来查看与newXMLNode正在进行的差异,并查看时间差异。

编辑:

以下是使用profr分析循环的输出。

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

这里没有什么特别明显的地方可以改善这一点。我发现它在%in%函数中花费了合理的时间,因此改进它会稍微减少总体时间(尽管你仍然需要反复迭代,所以它不会产生很大的不同)。最好的解决方案是将newXMLNode重写为向量化函数,这样您就可以完全跳过for循环。 alt text http://i42.tinypic.com/5x26gw.jpg