R: низкая производительность doParallel для манипулирования большими фреймами данных - PullRequest
0 голосов
/ 13 декабря 2018

прежде всего спасибо, что нашли время, чтобы прочитать мой вопрос.Больше всего мне нужна концептуальная помощь, так как я не понимаю, что не так с моей интерпретацией.Некоторое время назад я пытаюсь реорганизовать некоторые алгоритмы, которые я использую, чтобы они работали параллельно и использовали преимущества всех моих процессоров (что-то вроде 40, и мои процессы всегда используют по одному за раз).Ища примеры и литературу, я обнаружил, что, возможно, пакет, который лучше всего мне подходит, - это «doParallel», и я читал это: параллельный запуск цикла for в R Однако, когда я внедряю его в свой код, он отнимает у меня больше времени, чем раньше.Чтобы увидеть, в чем проблема, я сократил свой код и ограничил его простой задачей, которая показывает, что при использовании doParallel требуется больше времени, чем в общем цикле, который я всегда использую.Здесь я делюсь кодом, который я сделал для оценки, и выводом, который он мне дает, где вы можете увидеть, что занимает больше времени:

library(doParallel)
proteins_names <- c("TCSYLVIO_005590","TcCLB.503947.20","TcCLB.504249.111","TcCLB.511081.60","TCSYLVIO_009736","TcCLB.507071.100","TcCLB.507801.60","TcCLB.509103.10","TCSYLVIO_003504","TcCLB.503645.40","TcCLB.508221.490","TCSYLVIO_005223","TcCLB.505949.10","TcCLB.505949.120","TcCLB.506459.219","TcCLB.506763.340","TcCLB.506767.360","TcCLB.506955.250","TcCLB.506965.190","TcCLB.506965.90")
merged_total_test<-data.frame(matrix(nrow =100,ncol = 22, rnorm(n = 2200,sd = 2,mean=10)))
merged_total_test$protein<-proteins_names[sample(1:20,100,replace = T)]
merged_total_test$signal<-rnorm(n = 100,sd = 2,mean=1000)
cores=detectCores()
cl <- makeCluster(cores[1]-4)
registerDoParallel(cl)
init_time_parallel<-Sys.time()

dt_plot_total_parallel <- foreach (prot = 1:20, .combine=rbind) %dopar% {
  temp_protein_c <- merged_total_test[merged_total_test$protein == proteins_names[prot]&!is.na(merged_total_test$signal),]
  temp_protein_c
}

final_time_parallel<-Sys.time()
total_time_parallel<-final_time_parallel - init_time_parallel
stopCluster(cl)

init_time<-Sys.time()
dt_plot_total <- merged_total_test[0,]
for (prot in 1:20){
  print(prot)
  temp_protein_c <- merged_total_test[merged_total_test$protein == proteins_names[prot]&!is.na(merged_total_test$signal),]
  dt_plot_total<-rbind(dt_plot_total,temp_protein_c)
}
final_time<-Sys.time()
total_time<-final_time - init_time

total_time
total_time_parallel
identical(dt_plot_total,dt_plot_total_parallel)#should be true

вывод:

> total_time
Time difference of 0.3065186 secs
> total_time_parallel
Time difference of 1.939842 secs
> identical(dt_plot_total,dt_plot_total_parallel)#should be true
[1] TRUE
...