我在R中使用parSapply()
包中的parallel
。我需要对大量数据执行计算。即使并行执行也需要数小时,因此我决定使用write.table()
定期将结果写入群集中的文件,因为当内存不足或其他一些随机原因时,进程会不时崩溃,我想要从它停止的地方继续计算。我注意到我得到的一些csv文件行只是在中间切割,可能是由于多个进程同时写入文件。有没有办法在write.table()
执行时暂时锁定文件,因此其他集群无法访问它,或者唯一的出路是从每个集群写入单独的文件然后合并结果?
答案 0 :(得分:0)
现在可以使用filelock
(GitHub)创建文件锁了
为了通过parSapply()
简化此操作,您需要编辑循环,以便如果文件被锁定,该过程将不会简单地退出,而是重试一次或Sys.sleep()
进行一小段操作时间。但是,我不确定这将如何影响您的表现。
相反,我建议您创建特定于群集的文件来保存数据,从而消除了对锁定文件的需求,并且不会降低性能。之后,您应该能够编织这些文件并创建最终结果文件。
如果存在大小问题,则可以使用disk.frame
处理大于系统RAM的文件。