从R中的并行进程写入文件时锁定文件

use*_*038 7 parallel-processing r file-locking filelock

我用parSapply()parallel包河,我需要对大量的数据进行计算.即使并行执行也需要数小时,因此我决定定期将结果写入集群中的文件write.table(),因为当内存不足或其他一些随机原因导致进程崩溃时,我想继续计算把它停下来.我注意到我得到的一些csv文件行只是在中间切割,可能是由于多个进程同时写入文件.有没有办法在write.table()执行时暂时锁定文件,因此其他集群无法访问它,或者唯一的出路是从每个集群写入单独的文件然后合并结果?

mho*_*ovd 0

现在可以使用filelock( GitHub )创建文件锁

为了促进这一点,parSapply()您需要编辑循环,以便如果文件被锁定,进程不会简单地退出,而是重试或Sys.sleep()短时间尝试。但是,我不确定这将如何影响您的表现。

相反,我建议您创建可以保存数据的特定于集群的文件,从而消除对锁定文件的需要并且不会降低性能。之后您应该能够编织这些文件并创建最终结果文件。如果大小是一个问题,那么您可以使用它disk.frame来处理大于系统 RAM 的文件。