3

概述:

我的 B 对象是一个大矩阵 100 000 * 5000 of 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 ?

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

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

4

1 回答 1

1

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

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

信息:

  • 工作室 0.99.892
  • R 版本 3.3.1
于 2016-10-14T07:59:09.697 回答