Descrizione del problema:memoria condivisa in foreach parallelo R
Ho una grande matrice c
, caricato in memoria RAM. Il mio obiettivo è attraverso l'elaborazione parallela di avere accesso in sola lettura ad esso. Tuttavia, quando creo le connessioni, utilizzo doSNOW
, doMPI
, big.matrix
, ecc. La quantità di ram utilizzata aumenta in modo significativo.
C'è un modo per creare correttamente una memoria condivisa, da cui tutti i processi possono leggere, senza creare una copia locale di tutti i dati?
Esempio:
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: nell'immagine sopra, si potrebbe scoprire che la memoria aumenta molto fino foreach
estremità e viene liberato.
Ho esattamente lo stesso problema in questo momento e sono molto interessato a una soluzione. Ho anche osservato che vengono fatte delle copie invece della condivisione della memoria. – NoBackingDown