如何在snowfall(R)中对write.table实现锁定?

如何在snowfall(R)中对write.table实现锁定?,r,multithreading,locking,snowfall,R,Multithreading,Locking,Snowfall,我正在尝试让多个snowfall线程使用write.table()写入同一个文件。在少数情况下,行是断开的,也就是说,我观察到它看起来像是多行混合在一起,我认为这是当两个线程试图同时写入同一个文件时 例如: require(snowfall) sfInit(parallel = TRUE, cpus = 16) sfLapply(1:10000,function(x){ mytable = data.frame(a = c(1,2,3),b = c(4,5,6)) write.table(myt

我正在尝试让多个snowfall线程使用write.table()写入同一个文件。在少数情况下,行是断开的,也就是说,我观察到它看起来像是多行混合在一起,我认为这是当两个线程试图同时写入同一个文件时

例如:

require(snowfall)
sfInit(parallel = TRUE, cpus = 16)
sfLapply(1:10000,function(x){
mytable = data.frame(a = c(1,2,3),b = c(4,5,6))
write.table(mytable,"mytable.csv",sep = ',',append = T,col.names = F)
})

有没有一种方法可以确保一次只有一个线程写入文件,本质上是一个线程锁定文件,写入文件,然后释放锁?

您真的需要在worker上写入表吗?如果csv包含计算结果,则将其作为列表返回,然后在主脚本中写入列表会快得多。是的,我会这样做。实际输入是一个文件名列表(约500,总大小不超过50 GB,总输出文件大小约为3.5 GB)。我在中读取每个文件,并根据一些分析,将不同的部分写入不同的文件。这将进一步需要扩展,因此,这似乎是你运气不好。您可以编写单独的文件,然后像本文所建议的那样将它们连接起来:
batch
包有一个名为mergecsv的函数,用于合并并行csv结果。所以这正是我一直在考虑的-使用
x=system(“mkdir abc.lock”,ignore.stderr=T)
并在写入文件后删除锁文件夹,或者在文件名后附加
x=system(“echo$$”,intern=T)