R foreach несколько ядер, одновременно обращающихся к функции

У меня есть 1000 CSV-файлов в моем рабочем каталоге, и каждый файл имеет идентификатор местоположения, количество осадков и температуру. Структура одного файла показана ниже:

set.seed(123)
my.dat <- data.frame(Id = rep(1, each = 365),
                     rain = runif(365, min = 0, max = 20),
                     tmean = sample(20:40, 365, replace = T))

Я написал функцию Rcpp, которая также хранится в моем рабочем каталоге. Эта функция принимает данные об осадках и температуре и вычисляет некоторые производные переменные var1 и var2. Я хочу прочитать данные о погоде в каждом месте, применить функцию и сохранить соответствующий вывод с помощью пакета foreach.

location.vec <- 1:1000
  
myClusters <- makeCluster(6) 
registerDoParallel(myClusters)

foreach(i = 1:length(location.vec), 
       .packages = c('Rcpp', 'dplyr', 'data.table'), 
       .noexport = c('myRcppFunc'),
       .verbose = T) %dopar% 

{
   
  Rcpp::sourceCpp('myRcppFunc.cpp')  
   
  idRef <- location.vec[i]
 
  # read the weather data
  temp_weather <- fread(paste0('weather_',idRef,'.csv'))
   
  # apply my Rcpp function
  temp_weather[, c("var1","var2") := myRcppFunc(rain, tmean)]
   
  # save my output
  fwrite(temp_weather, 'paste0('weather_',idRef_modified,'.csv')')
}
 
stopCluster(myClusters)        

Этот цикл, кажется, имеет странное поведение. Иногда он просто зависает на 10-й итерации, иногда на 40-й и т. д. каждый раз, когда я запускаю его, и тогда мне приходится убивать задание.

Я сомневаюсь, что это вызвано тем фактом, что несколько процессов пытаются одновременно получить доступ к функции Rcpp, что приводит к этой проблеме? Как я могу это исправить? Могу ли я прочитать функцию Rcpp в аргументе foreach, чтобы мне не приходилось ее загружать? Любой другой совет?

Спасибо


person 89_Simple    schedule 19.07.2020    source источник
comment
Это обсуждалось несколько раз, поэтому кто-то может найти дубликат, но вкратце: НЕ используйте sourceCpp(). Соберите пакет, загрузите его на каждого воркера. Параллельные вызовы правильно настроенной функции Rcpp работают так же хорошо, как и любая другая скомпилированная функция R. Но никаких ярлыков. Также: вы опечатались: myRcppFunc. Не РЦКП.   -  person Dirk Eddelbuettel    schedule 20.07.2020
comment
Спасибо. Я попытался найти его. В любом случае вы можете указать мне какие-либо ресурсы о том, как поместить функцию Rcpp в пакет?   -  person 89_Simple    schedule 20.07.2020
comment
ТАК разместите здесь. Расширенный R.   -  person Croote    schedule 20.07.2020
comment
Воспользуйтесь поисковой системой или просто ищите здесь. Введите [rcpp] build package в строке поиска выше, чтобы найти сборку пакета [a] в контексте Rcpp, выбранного тегом [rcpp]. Только этот простой поиск дает 284 ответа. Вы также можете попробовать Google и т. Д. Мы писали об этом и объясняли в течение десятилетия, вы можете воспользоваться этим, просто выполнив поиск. Ссылка с результатами: stackoverflow.com/search?q=%5Brcpp%5D+build+package   -  person Dirk Eddelbuettel    schedule 20.07.2020