我用 parSapply()
来自 parallel
R 中的包。我需要对大量数据进行计算。即使并行执行也需要数小时,所以我决定使用 write.table()
定期将结果从集群写入文件。 ,因为进程在内存不足或其他一些随机原因时会不时崩溃,我想从它停止的地方继续计算。我注意到我得到的一些 csv 文件行只是在中间被剪掉了,可能是因为多个进程同时写入文件。有没有办法在 write.table()
期间锁定文件的时间?执行,所以其他集群无法访问它,或者唯一的出路是从每个集群写入单独的文件,然后合并结果?
最佳答案
现在可以使用 filelock
创建文件锁( GitHub )
为了便于使用 parSapply()
你需要编辑你的循环,这样如果文件被锁定,进程不会简单地退出,而是再试一次或 Sys.sleep()
在很短的时间内。但是,我不确定这将如何影响您的表现。
相反,我建议您创建可以保存数据的特定于集群的文件,从而无需锁定文件并且不会降低性能。之后,您应该能够编织这些文件并创建最终结果文件。
如果大小是一个问题,那么您可以使用 disk.frame
处理大于系统 RAM 的文件。
关于r - 从 R 中的并行进程写入文件时锁定文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20425071/