parallele Berechnungen für Referenzklassen

Ich habe eine Liste von ziemlich großen Objekten, auf die ich eine komplizierte Funktion parallel anwenden möchte, aber meine aktuelle Methode verwendet zu viel Speicher. Ich dachte, Referenzklassen könnten helfen, aber mitmcapply sie zu modifizieren scheint nicht zu funktionieren.

Die Funktion ändert das Objekt selbst, so dass ich das ursprüngliche Objekt mit dem neuen überschreibe. Da es sich bei dem Objekt um eine Liste handelt und ich nur einen kleinen Teil davon ändere, hatte ich gehofft, dass die Semantik von Rs Kopie-bei-Änderung das Erstellen mehrerer Kopien vermeiden würde. Wenn ich es leite, scheint es jedoch nicht der Fall zu sein für das, was ich tue. Hier ist ein kleines Beispiel für die R-Basismethoden, die ich verwendet habe. Es setzt den Kontostand korrekt auf Null zurück.

## 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

Es scheint, dass die Verwendung von Referenzklassen hilfreich sein kann, da sie veränderlich sind und verwendet werdenlapply es tut, was ich erwarte; Die Waage wird auf Null zurückgesetzt.

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

Aber wenn ich benutzemclapplywird nicht richtig zurückgesetzt. Beachten Sie, dass, wenn Sie unter Windows sind oder habenmc.cores=1, lapply wird stattdessen aufgerufen.

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

Was ist los? Wie kann ich parallel mit Referenzklassen arbeiten? Gibt es einen besseren Weg, um unnötiges Kopieren von Objekten zu vermeiden?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage