概述:
我的 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,但它没有解决问题。