我正在尝试在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="")
不到一秒钟。
答案 0 :(得分:1)
我建议使用Rprof
或profr
包来分析该功能。这将显示您的瓶颈在哪里,然后您可以考虑如何优化功能或改变您使用它的方式。
你的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