複雑な関数を並列に適用したいかなり大きなオブジェクトのリストがありますが、現在のメソッドはメモリを使いすぎています。参照クラスが役立つと思いましたが、mcapply
それらを変更するために使用してもうまくいかないようです。
この関数はオブジェクト自体を変更するため、元のオブジェクトを新しいオブジェクトで上書きします。オブジェクトはリストであり、私はそのほんの一部を変更しているだけなので、R のコピー オン モディファイ セマンティクスによって複数のコピーが作成されるのを回避できることを期待していました。ただし、それを実行すると、私がやっていることには当てはまらないようです。これは、私が使用してきたベース R メソッドの小さな例です。バランスを正しくゼロにリセットします。
## make a list of accounts, each with a balance
## and a function to reset the balance
foo <- lapply(1:5, function(x) list(balance=x))
reset1 <- function(x) {x$balance <- 0; x}
foo[[4]]$balance
## 4 ## BEFORE reset
foo <- mclapply(foo, reset1)
foo[[4]]$balance
## 0 ## AFTER reset
参照クラスは変更可能であるため、参照クラスを使用すると役立つようです。使用lapply
すると、期待どおりに機能します。残高はゼロにリセットされます。
Account <- setRefClass("Account", fields=list(balance="numeric"),
methods=list(reset=function() {balance <<- 0}))
foo <- lapply(1:5, function(x) Account$new(balance=x))
foo[[4]]$balance
## 4
invisible(lapply(foo, function(x) x$reset()))
foo[[4]]$balance
## 0
しかし、使用するmclapply
と、正しくリセットされません。Windows を使用している場合、または を持っている場合は、代わりにmc.cores=1
,が呼び出されることに注意してください。lapply
foo <- lapply(1:5, function(x) Account$new(balance=x))
foo[[4]]$balance
## 4
invisible(mclapply(foo, function(x) x$reset()))
foo[[4]]$balance
## 4
どうしたの?参照クラスを並行して操作するにはどうすればよいですか? オブジェクトの不必要なコピーを避けるためのより良い方法はありますか?