Параллельная обработка в R doParallel foreach

Я написал сценарий, который работает нормально, но, похоже, он не выполняет параллельную обработку. Я попытался изменить количество ядер с 3 на 16, но скорость генерации данных не изменилась. Может ли кто-нибудь сообщить мне, что я делаю неправильно и как я могу заставить это работать?

setwd("E:/Infections")

if (!require("pacman")) install.packages("pacman")
pacman::p_load(lakemorpho,rgdal,maptools,sp,doParallel,foreach,
doParallel)

cl <- makeCluster(5, outfile="E:/Infections/debug.txt")
registerDoParallel(cl)
x<-readOGR("E:/Infections/ByHUC6","Kodiak")
x_lake_length<-vector("numeric",length = nrow(x))
for(i in 1:nrow(x)){
  tmp<-lakeMorphoClass(x[i,],NULL,NULL,NULL)
  x_lake_length[i]<-lakeMaxLength(tmp,200)
  print(i)
  Sys.sleep(0.1)
}
df_Kodiak <- data.frame(x_lake_length)
write.table(df_Kodiak,file="E:/Infections/ByHUC6/Kodiak.csv",row.names=TRUE,col.names=TRUE, sep=",")

person Jen    schedule 07.06.2016    source источник
comment
Хорошо, я попробовал предложения, и скрипт запустился, но опять же похоже, что ядра больше не используются. У меня их 24, и системный монитор, и скорость чтения строк указывают на одинаковую скорость. Я просмотрел ссылку, чтобы сделать ее воспроизводимой, и посмотрю, смогу ли я воспроизвести файл пространственных данных.   -  person Jen    schedule 09.06.2016
comment
› R.Version() $platform [1] x86_64-w64-mingw32 $arch [1] x86_64 $os [1] mingw32 $system [1] x86_64, mingw32 $status [1] $major [1] 3 $minor [ 1] 2.2 $year [1] 2015 $month [1] 08 $day [1] 14 $svn rev [1] 69053 $language [1] R $version.string [1] R версия 3.2.2 (2015-08- 14) $псевдоним [1] Пожарная безопасность   -  person Jen    schedule 09.06.2016
comment
Я изучил возможность получения воспроизводимых данных с помощью rdgal, и включенные данные выборки полигонов содержат только 2 полигона. Поэтому я разместил небольшой образец своих данных на своем веб-сайте: researchersdilemma.com/myftp. Но если вы хотите использовать данные из rdgal.... library(rgdal) ogrDrivers() dsn ‹- system.file(vectors, package = rgdal)[1] ogrListLayers(dsn) ogrInfo(dsn=dsn, layer=trin_inca_pl03) polys ‹- readOGR(dsn=dsn, layer=trin_inca_pl03) writeOGR(polys, ., test_polys, driver=ESRI Shapefile) getwd() # чтобы узнать, куда был помещен файл Скачать est_Fetch.zip   -  person Jen    schedule 09.06.2016
comment
Спасибо. Да, обычно лучше, если мы все будем использовать встроенные данные, спасибо за загрузку. Я попробую, как только смогу.   -  person Hack-R    schedule 09.06.2016


Ответы (1)


Хорошо, я думаю, что получил это, вызвав foreach и %dopar%:

# Libraries ---------------------------------------------------------------
if (!require("pacman")) install.packages("pacman")
pacman::p_load(lakemorpho,rgdal,maptools,sp,doParallel,foreach,
               doParallel)

# Data --------------------------------------------------------------------
ogrDrivers()
dsn <- system.file("vectors", package = "rgdal")[1]
ogrListLayers(dsn)
ogrInfo(dsn=dsn, layer="trin_inca_pl03")
owd <- getwd()
setwd(dsn)
ogrInfo(dsn="trin_inca_pl03.shp", layer="trin_inca_pl03")
setwd(owd)
x <- readOGR(dsn=dsn, layer="trin_inca_pl03")
summary(x)

# HPC ---------------------------------------------------------------------
cores_2_use <- detectCores() - 4
cl          <- makeCluster(cores_2_use, useXDR = F)
clusterSetRNGStream(cl, 9956)
registerDoParallel(cl, cores_2_use)

# Analysis ----------------------------------------------------------------  
myfun <- function(x,i){tmp<-lakeMorphoClass(x[i,],NULL,NULL,NULL)
                        x_lake_length<-vector("numeric",length = nrow(x))
                        x_lake_length[i]<-lakeMaxLength(tmp,200)
                        print(i)
                        Sys.sleep(0.1)}

foreach(i = 1:nrow(x),.combine=cbind,.packages=c("lakemorpho","rgdal"))  %dopar% (
  myfun(x,i)
)

df_Kodiak <- data.frame(x_lake_length)

Как вы можете видеть на снимке экрана ниже, создается армия процессов Rscript.exe, использующих 20 из 24 ядер ЦП. Конечно, данные в примере, которые я использовал, невелики, поэтому на самом деле не нужны все эти ядра, но они должны служить доказательством концепции.

Я никогда не превышаю это соотношение, потому что, если вы используете 100% всех ядер ЦП, иногда случаются плохие вещи, и другие пользователи сервера могут быть недовольны вами.

Используется много ядер ЦП

person Hack-R    schedule 09.06.2016
comment
После того, как я удалил все предыдущие загруженные данные, я получаю сообщение об ошибке, указывающее на то, что вектор x-lake-length не сохраняется. Любые идеи? › df_Test_Fetch ‹- data.frame(x_lake_length) Ошибка в data.frame(x_lake_length): объект 'x_lake_length' не найден Data ogrDrivers() dsn‹-setwd(J:\\Elodea\\ByHUC6\\) ogrListLayers(dsn) ogrInfo (dsn=dsn, layer=Test_Fetch) owd ‹- getwd() setwd(dsn) ogrInfo(dsn=Test_Fetch.shp, layer=Test_Fetch) setwd(owd) x ‹- readOGR(dsn=dsn, layer=Test_Fetch) summary( Икс) - person Jen; 13.06.2016
comment
@Jen Эй, извини, я только что увидел твой комментарий. У вас все еще есть эта проблема? Если да, можете ли вы отправить новый вопрос, чтобы его было немного легче читать, и я поработаю над ним? - person Hack-R; 18.06.2016
comment
@Jen Поместите здесь комментарий со ссылкой, если вы откроете еще один вопрос, поэтому я обязательно его увижу. Я могу помочь завтра. - person Hack-R; 18.06.2016
comment
Привет Хак-Р. Я разместил вопрос с заголовком «Параллельная обработка» в R doParallel foreach save data [ссылка] (stackoverflow.com/questions/37910490/) - person Jen; 30.06.2016
comment
@Jen Спасибо, извините, я только что заметил это. Я думаю, что исправил код. - person Hack-R; 30.06.2016