Я запускаю вложенный цикл, используя %dopar%
для генерации фиктивного набора данных для целей опыта. Ссылка на ссылку: R вложенный foreach% dopar% во внешнем цикле и% do% во внутреннем цикле
образец набора данных
set.seed(123)
n = 10000 #number of unique IDs (10k as trial) , real data consits of 50k unique IDs
ID <- paste(LETTERS[1:8],sample(n),sep = "")
year <- c('2015','2016','2017','2018')
month <- c('1','2','3','4','5','6','7','8','9','10','11','12')
предварительноопределенная библиотека
library(foreach)
library(data.table)
library(doParallel)
# parallel processing setting
cl <- makeCluster(detectCores() - 1)
registerDoParallel(cl)
Тест 1: сценарий% dopar%
system.time(
output_table <- foreach(i = seq_along(ID), .combine=rbind, .packages="data.table") %:%
foreach(j = seq_along(year), .combine=rbind, .packages="data.table") %:%
foreach(k = seq_along(month), .combine=rbind, .packages="data.table") %dopar% {
data.table::data.table(
mbr_code = ID[i],
year = year[j],
month = month[k]
)
}
)
stopCluster(cl)
#---------#
# runtime #
#---------#
> user system elapsed
> 1043.31 66.83 1171.08
Тест 2: сценарий% do%
system.time(
output_table <- foreach(i = seq_along(ID), .combine=rbind, .packages="data.table") %:%
foreach(j = seq_along(year), .combine=rbind, .packages="data.table") %:%
foreach(k = seq_along(month), .combine=rbind, .packages="data.table") %do% {
data.table::data.table(
mbr_code = ID[i],
year = year[j],
month = month[k]
)
}
)
stopCluster(cl)
#---------#
# runtime #
#---------#
> user system elapsed
> 1101.85 1.02 1110.55
Ожидаемые результаты вывода
> view(output_table)
Проблема
при работе на %dopar%
я контролировал производительность процессора моей машины с помощью Resource Monitor
и заметил процессорыне используются полностью
Вопрос
Я пытался запустить вышеуказанный скрипт (test1 и test2) на моей машине i5, 4 ядра.Но кажется, что время выполнения для %do%
и %dopar%
близко друг к другу.Это проблема с моим сценарием?Мои реальные данные состоят из 50k
уникальных идентификаторов. Это означает, что при работе в %do%
потребуется очень много времени. Как я могу полностью использовать ЦП моей машины, чтобы сократить время работы?