Я работаю над большим фреймворком данных в R из 2,3 миллиона записей, которые содержат транзакции пользователей в местах со стартовым и остановившимся временами. Моя цель - создать новый фреймворк данных, который содержит количество времени, подключенного для каждого пользователя/каждого места. Позвольте этому почасовому подключению.
Транзакция может отличаться от 8 минут до 48 часов, поэтому целевой кадр данных будет составлять около 100 миллионов записей и будет расти каждый месяц.
В приведенном ниже коде показано, как разрабатывается окончательный формат данных, хотя общий код намного сложнее. Запуск всего кода занимает ~ 9 часов на процессоре Intel (R) Xeon (R) E5-2630 v3 @2,40 ГГц, 16-ядерном 128 ГБ оперативной памяти.
library(dplyr)
numsessions<-1000000
startdate <-as.POSIXlt(runif(numsessions,1,365*60*60)*24,origin="2015-1-1")
df.Sessions<-data.frame(userID = round(runif(numsessions,1,500)),
postalcode = round(runif(numsessions,1,100)),
daynr = format(startdate,"%w"),
start =startdate ,
end= startdate + runif(1,1,60*60*10)
)
dfhourly.connected <-df.Sessions %>% rowwise %>% do(data.frame(userID=.$userID,
hourlydate=as.Date(seq(.$start,.$end,by=60*60)),
hournr=format(seq(.$start,.$end,by=60*60),"%H")
)
)
Мы хотим распараллелить эту процедуру над (некоторыми) из 16 ядер, чтобы ускорить процедуру. Первой попыткой было использование пакета multidplyr
. Разделение производится на основе daynr
df.hourlyconnected<-df.Sessions %>%
partition(daynr,cluster=init_cluster(6)) %>%
rowwise %>% do(data.frame(userID=.$userID,
hourlydate=as.Date(seq(.$start,.$end,by=60*60)),
hournr=format(seq(.$start,.$end,by=60*60),"%H")
)
) %>% collect()
Теперь для функции rowwise
требуется, чтобы в качестве входных данных вместо раздела использовался блок данных.
Мои вопросы
-
Есть ли способ обхода для расчета rollise для разделов на ядро?
-
Кто-нибудь получил предложение выполнить этот расчет с помощью другого R-пакета и методов?