В Windows (еще предстоит тестирование в Linux) я пытаюсь (смущающе) распараллелить байесовскую выборку для больших групп населения.Я запускаю несколько тестов и обнаружил довольно симпатичное поведение при обработке списка, в котором объекты списка имеют разную длину.Используются следующие библиотеки: parallel
, snow
, doSNOW
, foreach
и rlecuyer
.
## Set parameters
cores<-4; N<-10004; Mean<-rnorm(N,sd=0.7); SD<-rnorm(N,mean=1,sd=0.1)
## Split the population
lst<-suppressWarnings(split(1:N,f=1:cores))
## Initialize cluster
cl <<- parallel::makePSOCKcluster(cores)
parallel::clusterSetRNGStream(cl, iseed = round(runif(cores)*1001))
## Export and run test
clusterExport(cl,c("lst"))
system.time(
theta<-as.vector(parSapply(cl,1:cores,function(x) rnorm(length(lst[[x]]),mean=Mean[lst[[x]]],sd=SD)))
)
## validate length
system.time(
n.lst<-as.vector(parSapply(cl,1:cores,function(x) lst[[x]]))
)
## Stop the cluster and check data
parallel::stopCluster(cl)
length(theta) # 10004
length(n.lst) # 10004
Теперь я изменяю численность населения на число, НЕ делимое на 4
## Set parameters
cores<-4; N<-10001; Mean<-rnorm(N,sd=0.7); SD<-rnorm(N,mean=1,sd=0.1)
## Run the same code above... And check the output arrays:
length(theta) # 25010000
length(n.lst) # 25010000
Так что да, список экспоненциально увеличился ... до длины массива, которая НЕ 2500 + 2500 + 2500 + 2501, а вместо этого 2500 *2501* 4 ... что для меня не имеет смысла.