Цикл Foreach с допараллельным в R не работает

#r #foreach #multicore #doparallel

#r #foreach #многоядерный #doparallel

Вопрос:

Я пишу R-скрипт, который анализирует большой файл json, берет первые 250 тыс. строк и выводит два разных файла. Я написал следующий for цикл, который работает просто отлично.

 
for(i in 1:4) {
  print(paste0("Iteration", " ", i))
  db <- read_lines(file = "February.jsonl", 
                   skip = 250000*i,
                   n_max = 250000)
  
  df <- stream_in(textConnection(db),
                  pagesize = 1000)
  rm(db)  
  
  tweets <- df %>%
    filter(lang=="en") %>%
    select(id_str, created_at, full_text,
           retweet_count,
           favorite_count, lang)
  txt <- tweets %>%
    select(full_text)%>%
    mutate(br = "***") %>%
    unite("tw", full_text:br)
  
  out_txt <- paste0("February",
                    "_", i, ".txt")
  out_csv <- paste0("feb-tw",
                    "_", i, ".csv")
  
  write.csv(tweets, out_csv, 
            fileEncoding = "UTF-8",
            row.names = FALSE)
  
  write.table(txt$tw, out_txt, 
              fileEncoding = "UTF-8",
              row.names = FALSE,
              col.names = FALSE)
  
  rm(list = ls())
  
}
 

Однако, поскольку файл действительно огромен, было бы полезно обработать цикл со всеми доступными процессорами. Я попытался использовать doParallel и foreach добавить это в начало кода

 library (doParallel)
registerDoParallel(cores = detectCores()-1)

foreach(i = 1:5) %dopar% {
  library(jsonlite)
  library(tidyverse)
  library(readr)
#same code below 
 

Это сбой после пяти минут вычислений с неизвестной ошибкой. Мне кажется, что код не выполняется, поскольку я даже не вижу первую строку цикла с print инструкцией.

Комментарии:

1. foreach циклы принципиально отличаются от for циклов, особенно если выполняются параллельно. Параллельные рабочие не имеют доступа к основному сеансу R и поэтому не могут печатать в нем.

2. Вы имеете в виду, что проблема в том, что я запросил foreach цикл для печати? Или это не связано с ошибкой?

3. Я не знаю, почему это не удается, вы даже не приводите воспроизводимый пример. Я просто указываю, что копирование кода из for цикла в foreach цикл и ожидание, что это будет «просто работать» параллельно, является довольно наивным подходом и указывает на то, что вы не изучили отличные виньетки пакета foreach.

4. К сожалению, я не знаю, как предоставить вам пример rep, это 60 ГБ файла json… Я не разработчик, я лингвист. Я пишу на R и Python, потому что мне это нужно для моих исследований. Да, я не изучал виньетки, и да, это наивный подход. Ну и что? Смысл задавать вопросы в том, чтобы узнать то, чего вы еще не знаете 🙂

5. Я не знаю, как параллельные рабочие получают доступ к глобальной среде, но завершение цикла с помощью rm, я думаю, не очень хорошая идея. Если один рабочий завершается раньше других, он может удалить все объекты, которые необходимы другим.