如果内存装得下的话,先把结果统一存内存里,循环完成再保存结果
R语言中多线程写文件,如何保证数据安全?
- 已编辑
我的办法比较土,一般我在并行写同一个文件时,采用的办法是写一个指示文件,就像 R 安装包时创建的 00LOCK 文件一样;对每个线程或进程,它写文件之前先检查一下这个指示文件是否存在,如果不存在,那么就创建它(相当于声明“现在我占着茅坑,其他人都不要来”),然后开始写你要写的文件,写完之后删掉这个指示文件;其它线程如果发现这个指示已经存在,就先等待着,一直等到指示文件消失,然后就轮到它们来写新的内容了。
这个办法可能也无法避免多个线程恰巧(不管这个概率多低)同时发现指示文件存在或不存在的情况,然后撞车。所以安全起见,最好还是不要所有线程写同一个文件,而是要么如 2 楼所说,各自写各自的文件,完事之后再回到主线程合并结果,要么如 3 楼所说,结果都存在内存里,完事后再合并了一起写。
- 已编辑
谢谢各位大拿yihui tctcab Ihavenothing 。
数据量比较大,得有>1T了,文件数量也比较多,8万多,如果再拆分一下,量有点大。
今天上午采用了和益辉类似的方法,也是比较笨的,思路如下:
首先按照规则生成这8万个文件,可以是空的;
然后启动多线程处理,首先判断目标文件是否存在。当某个线程处理到这个文件时,立即将文件名修改,然后将数据写入;结束后将文件名改回来。
当另外的线程也碰到了某个文件正好在被其它线程操作时,理论上它是找不到这个文件的,因为文件名被改掉了。所以当前线程就while循环判断文件是否存在,直到上一个线程将文件释放出来。
目前测试了部分的数据,好像正常(理论上确实存在那么一瞬间两个线程同一时刻处理同一个文件,后期处理时再看看)
以前处理一年的数据需要12小时,现在估计不到1小时,还在继续思考如何再优化提高速度
尝试一下Spark之类的试试呢
多进程并行写同一个文件理论上就是不可能安全的吧…… 加个自旋锁几乎是保证安全的唯一方式。本质来说加锁就是为了把并行写改成串行写。按照这个思路优化,可以在中间加一层缓存机制,先写到内存里,积累到一定大小再由一个进程统一写到文件里,这样就通过减少了写的次数提高了平均写入性能。
frankzhang21 刚百度了一下,又得学新东西,哈哈~真是活到老学到老,还有一半没学到
frankzhang21 我最近做并行也遇到了相同问题。想请问一下sparklyr怎么实现呀,感觉我只需要一个能并行写入的数据库就行