У меня возникли проблемы с пониманием поведения mclapply (или, может быть, чего-то другого).R, среда mclapply и удаление переменных
я сделать что-то вроде:
opt.Models = mclapply(1:100, mc.cores=20, function(i){
res = loadResult(reg, id=i)
return(post.Process(res))
})
loadResult
нагрузка один результата из ранее сохраненного BatchJob сессии. Таким образом, объект res
нуждается в ~ 170 МБ (примерно все 100 объектов имеют одинаковый размер +/- 5 МБ). При выполнении фрагмента кода объем памяти соответствует ожидаемому: 170 МБ * 20 = ~ 3,5 ГБ (я использовал 20 ядер). При выполнении этой части кода второй раз моя машина вдыхает огромный объем памяти (больше, чем доступно, поэтому я прекращаю выполнение). Ожидается, что, опять же, mclapply
разворачивает полную среду для каждого ребенка, и моя среда теперь имеет большую переменную opt.Models
с ~ 10 ГБ. Поэтому потребуется 10 * 20 = 200 ГБ.
Когда я удаляю opt.Models, rm(opt.Models)
, я все еще сталкиваюсь с той же проблемой. mclapply потребляет больше памяти, чем доступно (кстати, 90 ГБ). Итак, какая среда делает mclapply fork, или не opt.Models полностью ушел? Я не вижу его, используя ls()
.
Возможно, один из вас заметил что-то подобное.
С наилучшими пожеланиями,
Марио
Я не понимаю, почему вы не ограничиваете количество ядер до более приемлемого значения. –
Потому что это не моя проблема. Мне просто интересно, почему эта память не была выпущена. Уменьшение сердечников приведет лишь к более медленному сближению эффекта. – mariodeng