2015-01-15 2 views
2

У меня возникли проблемы с пониманием поведения 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().

Возможно, один из вас заметил что-то подобное.

С наилучшими пожеланиями,

Марио

+0

Я не понимаю, почему вы не ограничиваете количество ядер до более приемлемого значения. –

+1

Потому что это не моя проблема. Мне просто интересно, почему эта память не была выпущена. Уменьшение сердечников приведет лишь к более медленному сближению эффекта. – mariodeng

ответ

1

Вы должны вызвать функцию gc после удаления переменной, так что память, связанная с объектом, освобождается от сборщика мусора раньше, чем позже. Функция rm удаляет только ссылку на данные, в то время как фактический объект может продолжать существовать до тех пор, пока сборщик мусора в конечном итоге не запустится.

Вы также можете позвонить gc перед первым mclapply, чтобы облегчить тестирование:

gc() 
opt.Models = mclapply(1:100, mc.cores=20, function(i){ 
    res = loadResult(reg, id=i)  
    return(post.Process(res)) 
    }) 

# presumably do something with opt.Models... 

rm(opt.Models) 
gc() # free up memory before forking 

opt.Models = mclapply(1:100, mc.cores=20, function(i){ 
    res = loadResult(reg, id=i)  
    return(post.Process(res)) 
    }) 
+0

Стив, ты сделал мой день. Спасибо. – mariodeng

 Смежные вопросы

  • Нет связанных вопросов^_^