#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, я думаю, не очень хорошая идея. Если один рабочий завершается раньше других, он может удалить все объекты, которые необходимы другим.