3

概要:

私の 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 を使用する 1 つの rsession プロセスがあります。
parApply 関数を呼び出した後、4.5GB の nb_cpu スレッドがあります。

2 つの質問:

  • B は読み取り専用ですが、スレッド間で 1 つのメモリ スロットから共有できます。どうやって進める ?
  • それでも、なぜスレッドあたり 4.5 GB で、 ~2.1GB ではないのでしょうか?

「top」コマンドを使用してスレッドとメモリの使用状況を監視していますが、これはガベージ コレクターが解放できる表面的な使用状況ではありません。メモリ不足のためにスレッドがクラッシュします。30 スレッド (私のコードでは nb_cpu = 30) を備えた 128 GB メモリのコンピューターで実行されます。

注意: A の代わりに parApply で B (大きな行列) を使用して、反対のことも試みましたが、問題は解決しませんでした。

4

1 に答える 1