Ошибка памяти с циклом 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)

Ответы на вопрос(3)

Ваш ответ на вопрос