并行代码导致线程中内存使用量增加(RStudio 缺陷)
Parallelized code result in inflated memory usage in threads (RStudio deffect)
概览:
我的 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)
最初我有一个 rsession 进程使用 2.1GB 的 mermoy。
调用 parApply 函数后,我有 nb_cpu 个 4.5GB 的线程。
两个问题:
- 虽然 B 只能读取,但它可以在线程之间从单个内存槽共享。如何进行?
- 尽管如此,为什么每个线程 4.5 GB 而不是 ~2.1GB?
我使用'top'命令来监控线程和内存使用情况,这不是垃圾收集器可以释放的表面使用情况。线程因内存不足而崩溃。它 运行 在具有 30 个线程的 128GB 内存计算机上(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
概览:
我的 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)
最初我有一个 rsession 进程使用 2.1GB 的 mermoy。
调用 parApply 函数后,我有 nb_cpu 个 4.5GB 的线程。
两个问题:
- 虽然 B 只能读取,但它可以在线程之间从单个内存槽共享。如何进行?
- 尽管如此,为什么每个线程 4.5 GB 而不是 ~2.1GB?
我使用'top'命令来监控线程和内存使用情况,这不是垃圾收集器可以释放的表面使用情况。线程因内存不足而崩溃。它 运行 在具有 30 个线程的 128GB 内存计算机上(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