从并行循环内将文本追加到现有文件

时间:2018-06-20 22:56:43

标签: r doparallel

我目前正在并行处理一些数据,这是一个更大的循环的一部分,该循环本质上看起来像这样:

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的东西会起作用,因为它会迫使每个工作人员在写入之前等待不同的时间,但这在我进行的测试中似乎不起作用完成。

0 个答案:

没有答案