并行化代码导致线程中内存使用量膨胀(RStudio deffect)

时间:2016-04-11 13:57:48

标签: r rstudio glm rparallel

概述:

我的B对象是一个大矩阵100 000 * 5000的2 GB
我的A对象小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)

最初我使用2.1GB的mermoy进行单一的rsession过程 在调用parApply函数后,我有4.5GB的nb_cpu线程。

两个问题:

  • 虽然只读取B,但它可以从线程之间的单个内存插槽共享。怎么办?
  • 即使,为什么每个线程4.5 GB而不是〜2.1GB?

我使用&#39; top&#39;用于监视线程和内存使用情况的命令,这不是垃圾收集器可以释放的表面用法。线程因内存不足而崩溃。它运行在128GB内存计算机上,有30个线程(我的代码中nb_cpu = 30)。

NB:我也尝试过相反,在parApply中使用B(大矩阵)代替A,但它没有解决问题。

1 个答案:

答案 0 :(得分:1)

这个答案可能是部分的,因为我仍然认为在行为代码并行化时R行为很奇怪。 如果你从 RStudio 运行代码,并行线程往往会被〜/ .rstudio / suspended-session-data /

的大小夸大

所以要避免它,这是一个虚拟的解决方法。
 1.清洁环境
 2.注销
 3.登录
 4.加载您的数据
 5.运行并行代码

<强>信息:

  • Rstudio 0.99.892
  • R version 3.3.1