r-并行代码导致线程内存使用率膨胀(RStudio-deffect)



概述:

我的B对象是一个2 GB的大矩阵100 000*5000
我的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的单会话进程
调用parApply函数后,我有4.5GB的nb_cpu线程。

两个问题:

  • 当B只被读取时,它可以从线程之间的单个内存插槽中共享。如何继续
  • 尽管如此,为什么每个线程4.5 GB而不是2.1 GB

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

注意:我也尝试了相反的方法,在parApply中使用B(大矩阵)而不是A,但它并没有解决问题。

这个答案可能是部分的,因为在并行化代码时,我仍然认为R行为很奇怪。如果您运行RStudio中的代码,则并行线程往往会膨胀~/.RStudio/suspended session data/的大小

因此,为了避免这种情况,这里有一个伪解决方法
1.清洁环境
2.注销
3.登录
4.加载数据
5.运行并行代码

信息:

  • Rstudio 0.99.892
  • R版本3.3.1

最新更新