Ошибка памяти с циклом foreach в R в Windows 8 (64-разрядная версия) (пакет doParallel)
Я пытаюсь перейти от последовательного к параллельному подходу, чтобы выполнить несколько многомерных задач анализа временных рядов на большомdata.table
, Таблица содержит данные для разных групп, и я пытаюсь перейти отfor
цикл доforeach
цикл с использованиемdoParallel
пакет, чтобы воспользоваться преимуществами установленного многоядерного процессора.
Проблема, с которой я сталкиваюсь, связана с памятью и тем, как новые процессы R, кажется, потребляют ее в больших количествах. Я думаю, что происходит то, что большойdata.table
содержащий ВСЕ данные копируется в каждый новый процесс, поэтому у меня заканчивается ОЗУ, и Windows начинает подмену на диск.
Я создал упрощенный воспроизводимый пример, который повторяет мою проблему, но с меньшим количеством данных и меньшим количеством анализа в цикле. Было бы идеально, если бы существовало решение, которое могло бы передавать данные рабочим процессам только по требованию или разделять память, уже использованную между ядрами. В качестве альтернативы может уже существовать какое-то решение, позволяющее разбить большие данные на 4 части и передать их ядрам, чтобы у них было подмножество для работы.
Подобный вопрос был ранее опубликованздесь, на Stackoverflow Однако я не могу использоватьbigmemory
Решение, предлагаемое в качестве моих данных, содержит символьное поле. Я буду смотреть дальше вiterators
пакет, однако я был бы признателен за любые предложения от членов с опытом этой проблемы на практике.
rm(list=ls())
library(data.table)
num.series = 40 # can customise the size of the problem (x10 eats my RAM)
num.periods = 200 # can customise the size of the problem (x10 eats my RAM)
dt.all = data.table(
grp = rep(1:num.series,each=num.periods),
pd = rep(1:num.periods, num.series),
y = rnorm(num.series * num.periods),
x1 = rnorm(num.series * num.periods),
x2 = rnorm(num.series * num.periods)
)
dt.all[,y_lag := c(NA, head(y, -1)), by = c("grp")]
f_lm = function(dt.sub, grp) {
my.model = lm("y ~ y_lag + x1 + x2 ", data = dt.sub)
coef = summary(my.model)$coefficients
data.table(grp, variable = rownames(coef), coef)
}
library(doParallel)
registerDoParallel(4)
foreach(grp=unique(dt.all$grp), .packages="data.table", .combine="rbind") %dopar%
{
dt.sub = dt.all[grp == grp]
f_lm(dt.sub, grp)
}
detach(package:doParallel)