R
オブジェクトを並行して操作する方法はありますか?mclapply
フォークプロセスでparallel
は、ワークスペースの内容を各プロセスにコピーすることを理解しています。代わりに、結果を分割して結合することなく、コアにオブジェクトに対して独立したジョブを実行させたいと思います。ユースケースはnumeric
、data.frame内のすべての列factor
を並列の列に変更することです。別のユースケースは、多数のレベルを持つdata.frameのビニングファクターです。私がこれを行おうとしている主な理由は、1)メモリ不足を回避するため、および2)速度を上げるためです。
以下のオブジェクトb
は、data.frame内の列を分割しa
、適用後にそれらを結合した結果ですfactor
。代わりに、オブジェクトを直接操作したいと思いますa
。シリアルでは、ループの副作用として列a
を型に変換することができます。並行して、副作用としての列をタイプに変換することはできません。これは、(私が理解しているように)内部で、生成された各プロセスにローカルなオブジェクトを参照しているためです。factor
foreach...%do%
a
factor
foreach...%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