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



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

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

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

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

旧的unix技术看起来像这样:

`#请确保其他进程没有通过尝试创建目录来写入文件:如果目录存在,它会发送一个错误,然后重试。当成功创建锁定目录时,退出重复

repeat{ 
        if(system2(command="mkdir", args= "lockdir",stderr=NULL)==0){break}
    }
write.table(MyTable,file=filename,append=T)
#get rid of the locking directory
    system2(command = "rmdir", args = "lockdir") 

`

相关内容

  • 没有找到相关文章

最新更新