6

以下のコードは、Windows プラットフォームと Ubuntu プラットフォームで異なる結果を生成します。並列処理の処理方法が異なるためだと理解しています。

要約すると、Windows では実行できるのに、 Linux では並列 ( 、)でデータを実行することは
できません。 insertrbindmclapplymcmapply

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は解決策とは見なされません。

4

2 に答える 2

0

mclapplyWindows版のは に仕事を委譲しているので動いていると思いますlapply。タイミングまたは CPU コアの使用状況を確認すると、これを確認できます。R ソースによると、Windowsmclapplymcmapplyは順次バージョンに置き換えられます。

コードの並列化方法に何か問題があるようで、現時点では何が正確にわかりません。

于 2015-05-22T12:41:25.647 に答える