Я написал функцию, в которой я выполняю некоторый код параллельно:
cl <- makeCluster(nc, outfile = "")
registerDoParallel(cl, nc)
pred <- foreach(s = iter(seq(1L,length(dfr_missings))),
.packages = c('RANN', 'randomForest','magrittr'),
.errorhandling = 'stop',
.verbose = F,
.combine = 'cbind',
.export = c("myRoughfix")) %dopar% {
#
#some code goes here
#
}
stopCluster(cl)
stopImplicitCluster()
Функция работает, как и ожидалось, с меньшими кадрами данных. Однако мне нужно, чтобы он работал с большими.
Я получаю следующую ошибку:
Error in unserialize(socklist[[n]]) : error reading from connection
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Насколько я понимаю сообщение об ошибке, оно указывает на то, что мне не хватило памяти. Размер кадра данных, с которым у меня возникают проблемы, составляет ~ 770 МБ. Я работаю на машине с 256 ГБ ОЗУ и 48 ядрами. Я ожидал, что эта машина сможет справиться с таким большим объектом. Код не делает ничего, что интенсивно использует память.
Итак, мой вопрос: возможно ли, что для рабочих процессов установлены некоторые ограничения памяти, которыми можно управлять с помощью глобальной опции? Возможно вариант ОС или makeCluster().
Любые другие мысли приветствуются.
P.S. Я нахожусь на предустановленной виртуальной машине на 64-битном oracle linux 6 с версией R - "Oracle Distribution of R version 3.1.1"
gc()
? - person loki   schedule 02.08.2017gc()
в разделе вашего кода? Освобождает память, которая не используется. В моем коде я ставлюgc();gc();gc()
после некоторых строк, особенно после огромных вычислений. Поскольку вы импортируетеrandomForest
, я бы предположил, что сборка мусора может улучшить использование ресурсов. - person loki   schedule 02.08.2017myRoughfix
? - person nrussell   schedule 02.08.2017gdb
, чтобы выяснить, в какой функции запускается неудачное выделение. Однако в нынешнем виде ваша проблема не воспроизводима. - person nrussell   schedule 02.08.2017registerDoSEQ()
(последовательно)? - person F. Privé   schedule 03.08.2017