Rオブジェクトを並行して操作する方法はありますか?mclapplyフォークプロセスでparallelは、ワークスペースの内容を各プロセスにコピーすることを理解しています。代わりに、結果を分割して結合することなく、コアにオブジェクトに対して独立したジョブを実行させたいと思います。ユースケースはnumeric、data.frame内のすべての列factorを並列の列に変更することです。別のユースケースは、多数のレベルを持つdata.frameのビニングファクターです。私がこれを行おうとしている主な理由は、1)メモリ不足を回避するため、および2)速度を上げるためです。
以下のオブジェクトbは、data.frame内の列を分割しa、適用後にそれらを結合した結果ですfactor。代わりに、オブジェクトを直接操作したいと思いますa。シリアルでは、ループの副作用として列aを型に変換することができます。並行して、副作用としての列をタイプに変換することはできません。これは、(私が理解しているように)内部で、生成された各プロセスにローカルなオブジェクトを参照しているためです。factorforeach...%do%afactorforeach...%dopar%a
これを可能にするパッケージはありRますか?
a <- data.frame(b=c(1,1,2,2), c=c(2,2,3,3))
str(a)
> str(a)
'data.frame': 4 obs. of 2 variables:
$ b: num 1 1 2 2
$ c: num 2 2 3 3
#serial
b <-
foreach (i = iter(1:ncol(a)), .combine = data.frame) %do% {
a[,i] <- factor(a[,i])
}
str(a)
str(b)
> str(a)
'data.frame': 4 obs. of 2 variables:
$ b: Factor w/ 2 levels "1","2": 1 1 2 2
$ c: Factor w/ 2 levels "2","3": 1 1 2 2
> str(b)
'data.frame': 4 obs. of 2 variables:
$ result.1: Factor w/ 2 levels "1","2": 1 1 2 2
$ result.2: Factor w/ 2 levels "2","3": 1 1 2 2
#parallel
a <- data.frame(b=c(1,1,2,2), c=c(2,2,3,3))
b <-
foreach (i = iter(1:ncol(a)), .combine = data.frame) %dopar% {
a[,i] <- factor(a[,i])
}
str(a)
str(b)
> str(a)
'data.frame': 4 obs. of 2 variables:
$ b: num 1 1 2 2
$ c: num 2 2 3 3
> str(b)
'data.frame': 4 obs. of 2 variables:
$ result.1: Factor w/ 2 levels "1","2": 1 1 2 2
$ result.2: Factor w/ 2 levels "2","3": 1 1 2 2