我正在尝试一个超级简单的 foreach
.combine
任务,读取文件夹中的 Rds
文件和 rbind
它们合二为一。
all_dfs <- foreach(j = list.files(pattern = ".Rds"),
.errorhandling = "pass",
.combine = rbind,
.multicombine = TRUE) %dopar% {eachRdsFile <- readRDS(j)}
然后得到错误信息:
错误调用组合函数: simpleError in rbind(deparse.level,...): invalid list argument: all variables should have the same length(所有变量的长度应该相同)
然而,如果我循环浏览所有文件,并询问它们的 length
,它们都是一样的(82)。
for (j in list.files(pattern = ".Rds")) {
eachRdsFile <- readRDS(j)
print(length(eachRdsFile))}
(82): The foreach
206的153号文件发生错误。在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个文件?我的reprex尝试成功了,有206个文件,所以没有问题。rbinding
>=153的任何对象,显然。
谁能想到为什么会发生这种情况?我快想不出来了。这感觉像是一个bug?先谢谢你了。
编辑:(再次)感谢Florian Privé的帮助,解决了这个问题。这个问题与我使用的 writeLines
和 sink
(因为我不能得到 print
(或 progress bars
)来并行工作,无论我如何努力)。)
writeLines(c(""), "log.txt")
all_dfs <- foreach(...){
sink("log.txt", append = TRUE)
当我输出到list时,发现问题出在sink stack full错误。
我终于解决了这个问题,多亏了 dmi3kno 的回答,并回到使用 .combine
的方法,但没有错误。
您可以删除 .combine
得到一个列表,然后用 do.call("rbind", your_list)
.
可能也会更有效率。