Я пытаюсь выполнить очень простую задачу foreach
.combine
, чтобы прочитать папку из Rds
файлов и rbind
их в один:
all_dfs <- foreach(j = list.files(pattern = ".Rds"),
.errorhandling = "pass",
.combine = rbind,
.multicombine = TRUE) %dopar% {eachRdsFile <- readRDS(j)}
и получить ошибку:
ошибка вызова функции объединения: simpleError в rbind (deparse.level, ...): неверный аргумент списка: все переменные должны иметь одинаковую длину
Однако, если я oop через все файлы и спросите их length
, они все одинаковые (82):
for (j in list.files(pattern = ".Rds")) {
eachRdsFile <- readRDS(j)
print(length(eachRdsFile))}
Ошибка foreach
возникает в файле 153 из 206. Она работает в 1: 152 , Я открыл и исследовал файл 153, и он отлично выглядит, как и 152. Я попробовал минимальный воспроизводимый пример:
library(parallel)
library(doMC)
mycores <- 8
registerDoMC(cores = mycores)
testdfs <- foreach(j = 1:206,.errorhandling = "pass",.combine = rbind,.multicombine = TRUE) %dopar% {
eachdf <- data.frame(A = runif(10), B = runif(10))}
, но он работает нормально. Я запустил foreach
для 1: 152, затем загрузил файл 153 и rbound
вместе, и это тоже отлично работает. Foreach
для файлов 153: 206 работает нормально (206 - последний файл). 55: 206 работает нормально (152 файла). 54: 206 не удается (153 файла). Возможно, проблема в rbinding
> = 153 файлах? Моя попытка репрезентации завершилась успешно с 206 файлами, поэтому проблем с rbinding
> = 153 ЛЮБОГО объекта, разумеется, нет.
Может кто-нибудь придумать причину, по которой это может происходить? У меня заканчиваются идеи. Это похоже на ошибку? Заранее спасибо.
Редактировать: Спасибо (еще раз) Флориану Приве за помощь в решении. Проблема была связана с моим использованием writeLines
и sink
(поскольку я не могу заставить print
(или progress bars
) работать параллельно, как бы я ни старался):
writeLines(c(""), "log.txt")
all_dfs <- foreach(...){
sink("log.txt", append = TRUE)
Когда я вывел в список, обнаружилось, что ошибка переполнения стека была проблемой:
Я наконец исправил это благодаря Ответ dmi3kno и вернулся к использованию подхода .combine
без ошибок.