Распараллеленный код приводит к завышенному использованию памяти в потоках (эффект RStudio)

Обзор:

Мой объект B - большая матрица 100 000 * 5000 из 2 ГБ
мой объект меньше 1000 * 5000

analyse_with_glm <- function(Y) {
  cond1 = unlist(apply(B, 2, function(X) coef(summary(glm(Y~X)))[,4][2]))
  cond2 = unlist(apply(B, 2, function(X) coef(summary(glm(Y~X+cov2)))[,4][2]))
  cond3 = unlist(apply(B, 2, function(X) coef(summary(glm(Y~X+cov3)))[,4][2]))
  list(cond1, cond2, cond3)}

cl = makeCluster(nb_cpu, type = "FORK", outfile='outcluster.log')
res = parApply(cl, A, 2, analyse_with_glm)

Первоначально у меня был один процесс rsession с использованием 2,1 ГБ моей русалки.
После вызова функции parApply у меня есть потоки nb_cpu 4,5 ГБ.

Два вопроса:

  • Хотя B только для чтения, он может быть разделен из одного слота памяти между потоками. Как действовать?
  • Хотя почему 4,5 ГБ на поток, а не ~2,1 ГБ?

Я использую команду "top" для мониторинга потоков и использования памяти, и это не поверхностное использование, которое может освободить сборщик мусора. Падение потоков из-за нехватки памяти. Он работает на компьютере с 128 ГБ памяти и 30 потоками (в моем коде nb_cpu = 30).

NB: Я также попробовал наоборот, используя B (большую матрицу) в parApply вместо A, но это не решило проблему.

1 ответ

Решение

Этот ответ может быть частичным, так как я все еще считаю поведение R странным, когда дело доходит до распараллеливания кода. Если вы запускаете код из RStudio, параллельный поток имеет тенденцию быть завышенным на размер ~/.rstudio/ подвесной-сессии-данных /

Поэтому, чтобы избежать этого, вот обходной путь.
1. Очистить окружающую среду
2. Выйти
3. Вход в систему
4. Загрузите ваши данные
5. Запустите параллельный код

ИНФОРМАЦИЯ:

  • Rstudio 0.99.892
  • Версия R 3.3.1
Другие вопросы по тегам