Создание больших XML-деревьев в R - PullRequest
1 голос
/ 19 марта 2010

Я пытаюсь создать большое дерево 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 Ответ

1 голос
/ 19 марта 2010

Я бы рекомендовал профилировать функцию с помощью 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...