我使用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")
`