Problembeschreibung:Gemeinsamer Speicher parallel in foreach R
Ich habe eine große Matrix c
, im RAM-Speicher geladen. Mein Ziel ist es, durch parallele Verarbeitung nur Lesezugriff darauf zu haben. Wenn ich die Verbindungen jedoch entweder doSNOW
, doMPI
, big.matrix
usw. erstelle, erhöht sich die verwendete RAM-Menge dramatisch.
Gibt es eine Möglichkeit, einen gemeinsamen Speicher ordnungsgemäß zu erstellen, in dem alle Prozesse lesen können, ohne eine lokale Kopie aller Daten zu erstellen?
Beispiel:
libs<-function(libraries){# Installs missing libraries and then load them
for (lib in libraries){
if(!is.element(lib, .packages(all.available = TRUE))) {
install.packages(lib)
}
library(lib,character.only = TRUE)
}
}
libra<-list("foreach","parallel","doSNOW","bigmemory")
libs(libra)
#create a matrix of size 1GB aproximatelly
c<-matrix(runif(10000^2),10000,10000)
#convert it to bigmatrix
x<-as.big.matrix(c)
# get a description of the matrix
mdesc <- describe(x)
# Create the required connections
cl <- makeCluster(detectCores())
registerDoSNOW(cl)
out<-foreach(linID = 1:10, .combine=c) %dopar% {
#load bigmemory
require(bigmemory)
# attach the matrix via shared memory??
m <- attach.big.matrix(mdesc)
#dummy expression to test data aquisition
c<-m[1,1]
}
closeAllConnections()
RAM: im Bild oben, können Sie feststellen, dass der Speicher eine Menge bis foreach
Ende erhöht und es wird befreit.
Ich habe gerade genau das gleiche Problem und bin sehr an einer Lösung interessiert. Ich habe auch beobachtet, dass Kopien gemacht werden, anstatt dass Speicher geteilt wird. – NoBackingDown