Problem z pamięcią z pętlą foreach w R na Windows 8 (64-bit) (pakiet doParallel)

Próbuję przejść od podejścia szeregowego do równoległego, aby wykonać kilka wieloczynnikowych zadań analizy szeregów czasowych na dużymdata.table. Tabela zawiera dane dla wielu różnych grup i próbuję przejść od afor pętla do aforeach pętla za pomocądoParallel pakiet, aby skorzystać z zainstalowanego procesora wielordzeniowego.

Problem, którego doświadczam, dotyczy pamięci i tego, w jaki sposób nowe procesy R wydają się zużywać jej duże ilości. Myślę, że to, co się dzieje, jest dużedata.table zawierające WSZYSTKIE dane są kopiowane do każdego nowego procesu, dlatego zabrakło mi pamięci RAM i system Windows zaczyna zamieniać się na dysk.

Stworzyłem uproszczony, powtarzalny przykład, który powiela mój problem, ale z mniejszą ilością danych i mniejszą analizą wewnątrz pętli. Idealnie byłoby, gdyby istniało rozwiązanie, które mogłoby jedynie udostępniać dane procesom roboczym na żądanie lub udostępniać pamięć już używaną między rdzeniami. Alternatywnie może już istnieć jakieś rozwiązanie, aby podzielić duże dane na 4 porcje i przekazać je do rdzeni, aby miały podzbiór do pracy.

Podobne pytanie zostało już opublikowanetutaj na Stackoverflow nie mogę jednak skorzystać zbigmemory rozwiązanie oferowane jako moje dane zawiera pole znakowe. Przyjrzę się dalejiterators pakiet, jednak doceniłbym wszelkie sugestie członków z doświadczeniem tego problemu w praktyce.

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)

questionAnswers(3)

yourAnswerToTheQuestion