以下のコードは、Windows プラットフォームと Ubuntu プラットフォームで異なる結果を生成します。並列処理の処理方法が異なるためだと理解しています。
要約すると、Windows では実行できるのに、 Linux では並列 ( 、)でデータを実行することは
できません。 insert
rbind
mclapply
mcmapply
Windowsで並列に動作しないことを指摘してくれた@Hong Ooiに感謝
mclapply
しますが、以下の質問はまだ有効です。
もちろん、同じへの複数の挿入はありませんdata.frame
。各挿入は別々の data.frame に実行されます。
library(R6)
library(parallel)
# storage objects generator
cl <- R6Class(
classname = "cl",
public = list(
data = data.frame(NULL),
initialize = function() invisible(self),
insert = function(x) self$data <- rbind(self$data, x)
)
)
N <- 4L # number of entities
i <- setNames(seq_len(N),paste0("n",seq_len(N)))
# random data.frames
set.seed(1)
ldt <- lapply(i, function(i) data.frame(replicate(sample(3:10,1),sample(letters,1e5,rep=TRUE))))
# entity storage
lcl1 <- lapply(i, function(i) cl$new())
lcl2 <- lapply(i, function(i) cl$new())
lcl3 <- lapply(i, function(i) cl$new())
# insert data
invisible({
mclapply(names(i), FUN = function(n) lcl1[[n]]$insert(ldt[[n]]))
mcmapply(FUN = function(dt, cl) cl$insert(dt), ldt, lcl2, SIMPLIFY=FALSE)
lapply(names(i), FUN = function(n) lcl3[[n]]$insert(ldt[[n]]))
})
### Windows
sapply(lcl1, function(cl) nrow(cl$data)) # mclapply
# n1 n2 n3 n4
# 100000 100000 100000 100000
sapply(lcl2, function(cl) nrow(cl$data)) # mcmapply
# n1 n2 n3 n4
# 100000 100000 100000 100000
sapply(lcl3, function(cl) nrow(cl$data)) # lapply
# n1 n2 n3 n4
# 100000 100000 100000 100000
### Unix
sapply(lcl1, function(cl) nrow(cl$data)) # mclapply
#n1 n2 n3 n4
# 0 0 0 0
sapply(lcl2, function(cl) nrow(cl$data)) # mcmapply
#n1 n2 n3 n4
# 0 0 0 0
sapply(lcl3, function(cl) nrow(cl$data)) # lapply
# n1 n2 n3 n4
# 100000 100000 100000 100000
そして質問:
Linux プラットフォームでrbind
個別の を並列に実行するにはどうすればよいですか?data.frame
私の場合、 PS Off-memory storage likeSQLite
は解決策とは見なされません。