У меня есть большой код, а шаг агрегации - это узкое место в скорости.
В моем коде я хотел бы ускорить шаг группировки данных, чтобы быть быстрее. SNOTE (простой нетривиальный пример) моих данных выглядит следующим образом:
library(data.table)
a = sample(1:10000000, 50000000, replace = TRUE)
b = sample(c("3m","2m2d2m","3m2d1i3s2d","5m","4m","9m","1m"), 50000000, replace = TRUE)
d = sample(c("3m","2m2d2m","3m2d1i3s2d","5m","4m","9m","1m"), 50000000, replace = TRUE)
e = a
dt = data.table(a = a, b = b, d = d, e = e)
system.time(c.dt <- dt[,list(b = paste(b, collapse=""), d = paste(d, collapse=""), e = e[1], by=a)])
user system elapsed
60.107 3.143 63.534
Это довольно быстро для такого большого примера данных, но в моем случае я все еще ищу ускорение. В моем случае у меня несколько ядер, поэтому я почти уверен, что должен быть способ использовать такие вычислительные возможности.
Я открыт для изменения моего типа данных на объекты data.frame или idata.frame(теоретически idata.frame предположительно быстрее, чем data.frames).
Я провел некоторое исследование и, похоже, у пакета plyr есть некоторые параллельные возможности, которые могут быть полезны, но я все еще борется за то, как это сделать для группы, которую я пытаюсь сделать. В другом SO-сообщении они обсуждают некоторые из этих идей. Я все еще не уверен в том, насколько я достиг этого с помощью этой распараллеливания, поскольку он использует функцию foreach. По моему опыту функция foreach не является хорошей идеей для миллионов быстрых операций, потому что усилие связи между ядрами приводит к замедлению усилий по распараллеливанию.