Заранее спасибо за вашу помощь.
Суть в том, что у меня есть огромные циклы foreach, которые работают намного медленнее, чем я привык, и мне любопытно, могу ли я ускорить их - это занимает часы (возможно, даже дни).
Итак, мне дали два больших куска данных (от друга, которому нужна помощь). Первая - это очень большая матрица (728396 строк на 276 столбцов) данных genti c для 276 участников (я назову это M1). Второй - это набор данных (276 строк и 34 столбца) других разных данных об участниках (я назову это DF1). Мы используем многоуровневую регрессионную модель логистики c, использующую оба набора данных.
Я использую Windows P C с 8 виртуальными ядрами, работающими на 4,7 ГГц и 36 ГБ ОЗУ.
Вот часть кода, которую я написал / изменил:
library(pacman)
p_load(car, svMisc, doParallel, foreach, tcltk, lme4, lmerTest, nlme)
load("M1.RDATA")
load("DF1.RDATA")
clust = makeCluster(detectCores() - 3, outfile="")
#I have 4 physical cores, 8 virtual. I've been using 5 because my cpu sits at about 89% like this.
registerDoParallel(clust)
getDoParWorkers() #5 cores
n = 728396
res_function = function (i){
x = as.vector(M1[i,])
#Taking one row of genetic data to be used in the regression
fit1 = glmer(r ~ x + m + a + e + n + (1 | famid), data = DF1, family = binomial(link = "logit"))
#Running the model
c(coef(summary(fit1))[2,1:4], coef(summary(fit1))[3:6,1], coef(summary(fit1))[3:6,4], length(fit1@optinfo[["conv"]][["lme4"]][["messages"]]))
#Collecting data, including whether there are any convergence error messages
}
start_time = Sys.time()
model1 = foreach(i = 1:n, .packages = c("tcltk", "lme4"), .combine = rbind) %dopar% {
if(!exists("pb")) pb <- tkProgressBar("Parallel task", min=1, max=n)
setTkprogressBar(pb, i)
#This is some code I found here to keep track of my progress
res_function(i)
}
end_time = Sys.time()
end_time - start_time
stopCluster(clust)
showConnections()
В прошлом я выполнял почти идентичный код, и это занимало у меня всего около 13 минут. Однако я подозреваю, что эта модель занимает больше памяти, чем обычно, на каждом ядре (вероятно, из-за второго уровня) и замедляет работу. Я читал, что BiocParallel, Future или даже Microsoft R Open могут работать лучше, но я не добился большого успеха, используя какой-либо из них (вероятно, из-за отсутствия собственных знаний). Я также прочитал немного о пакете "bigmemory", чтобы более эффективно использовать большую матрицу в ядрах, но я столкнулся с несколькими ошибками, когда пытался его использовать (неудачные работники и тому подобное). Мне также интересно узнать о возможности использования моего графического процессора (Titan X Pascal) для дополнительного умм, если кто-то знает об этом больше.
Любой совет будет очень признателен!