Могу ли я сделать этот R foreach l oop быстрее? - PullRequest
0 голосов
/ 25 апреля 2020

Заранее спасибо за вашу помощь.

Суть в том, что у меня есть огромные циклы 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) для дополнительного умм, если кто-то знает об этом больше.

Любой совет будет очень признателен!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...