我目前正在并行处理一些数据,这是一个更大的循环的一部分,该循环本质上看起来像这样:
for (i in files) {
doFunction
foreach (j = 1:100) %dopar% {
parallelRegFun}
}
doFunction
提取每年的平均数据,而parallelRegFun
使用最大重叠的窗口(并非总是1:100,有时可以是1:1000+)对数据进行回归,这就是为什么正在并行执行)。
parallelRegFun
的一部分涉及将数据写入CSV
write_csv(parallelResults,
path = "./outputFile.csv",
append = TRUE, col_names = FALSE)
问题在于,在写入输出文件时,通常会将数据附加到现有行,或者写入空白行。例如,输出可能如下所示:
+-----+-------+------+---+-------+------+
| Uid | X | Y | | | |
+-----+-------+------+---+-------+------+
| 1 | 0.79 | 2.37 | | | |
+-----+-------+------+---+-------+------+
| 2 | -1.88 | 3.53 | 3 | -0.54 | 3.32 |
+-----+-------+------+---+-------+------+
| | | | | | |
+-----+-------+------+---+-------+------+
| 5 | -0.18 | 1.45 | | | |
+-----+-------+------+---+-------+------+
此后需要进行大量清理,但是当某些输出文件为100 + MB时,必须手动检查和清理大量数据。看来,如果写入空白行,则该行的输出将完全从输出中丢失-即它不在添加到现有行的数据中。
无论如何,有没有让doParallel
工作人员检查文件是否正在访问以及是否正在访问,等到它不在才附加输出?
我认为在Sys.sleep()
命令之前类似write_csv
的东西会起作用,因为它会迫使每个工作人员在写入之前等待不同的时间,但这在我进行的测试中似乎不起作用完成。