首页 > 解决方案 > 从并行循环内部将文本附加到现有文件

问题描述

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

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

标签: rdoparallel

解决方案


推荐阅读