我在我的 Debian 9 PC 和 Red Hat 4.8.5 高性能计算集群上间歇性地遇到了 %dopar% (带有 doMC 后端)和 fwrite() 的问题。行为并不总是一致的,但简而言之,fwrite 和 foreach 故障——即使特别要求 fwrite 仅使用一个内核(通过 setDTthreads 或 fwrite 中的 nThread)以避免并行工作人员的怪异。在最近的案例中,一个实例没有写入任何文件,而在另一对实例中,12 个文件中只写入了 1 到 4 个。更重要的是,foreach 没有正确返回。fwrite 不是 foreach 循环中的最后一行;之后,它打算返回一些东西,但它返回的是 NULL。同时,没有检测到错误——集群上的退出状态为 0,并且不打印任何警告。
如果使用顺序 %do%,它会按预期工作(并且可以使用多个线程进行 fwrite)。我不确定我能否提供一个可重现的例子,因为结果并不一致。对于最新行为,我使用的是 R 3.3.3、data.table 1.10.4-3、doMC 1.3.5 和 foreach 1.4.4。我使用来自 GitHub 的最新版本的 data.table v1.10.5 遇到了同样的问题。该问题似乎与文件大小有关;它倾向于在相对较小的文件上正常工作,但是一旦接近 0.3GB 及以上,它就会变得混乱。实际上,在编写较小的文件(相同 data.tables 的子集)时,相同的代码也可以工作。
我不知道这真的是发布这个的最佳位置——我只是在这里问这个,因为 GitHub 页面指定我应该在提交问题之前。那么,有没有人遇到过这个问题,有没有人知道解决方法(即,如何在使用单线程 fwrite 和大型数据集时保留多核并行循环)?