Описание на проблема:
Имам голяма матрица c
, заредена в RAM памет. Целта ми е чрез паралелна обработка да имам достъп само за четене до него. Въпреки това, когато създавам връзките, или използвам doSNOW
, doMPI
, big.matrix
и т.н., използваното количество ram се увеличава драстично.
Има ли начин правилно да се създаде споделена памет, откъдето всички процеси могат да четат, без да се създава локално копие на всички данни?
Пример:
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: в изображението по-горе може да откриете, че паметта се увеличава много, докато
foreach
свърши и бъде освободена.