2010-03-19 2 views
1

Я пытаюсь создать большой XML-дерево в R. Вот упрощенная версия кода:Создание больших XML-деревьев в R

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

Я бы рекомендовал профилировать функцию, используя Rprof или пакет profr. Это покажет вам, где ваше узкое место, и тогда вы можете подумать о том, как оптимизировать функцию или изменить способ ее использования.

Ваш пример paste будет намного быстрее, потому что он векторизован. Для более справедливого сравнения вы можете увидеть разницу там, зациклившись на paste, как вы сейчас делаете с newXMLNode и видите разницу во времени.

Edit:

Вот выход из профилирования контура с 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

Смежные вопросы