【发布时间】:2013-02-24 01:32:30
【问题描述】:
我已经看到很多关于writing 文件的questions,但我想知道打开文本文件、附加一些数据然后在您要从以下位置写入时再次关闭它的最可靠方法是什么许多连接(即在并行计算情况下),并且不能保证每个连接何时要写入文件。
例如在下面的玩具示例中,它只使用了我桌面上的内核,它似乎工作正常,但我想知道如果写入时间变长并且写入的进程数,这种方法是否容易失败文件增加(尤其是在可能存在一些延迟的网络共享上)。
当可能有其他从属进程想要同时写入文件时,任何人都可以提出一种可靠、明确的方式来打开、写入然后关闭连接吗?
require(doParallel)
require(doRNG)
ncores <- 7
cl <- makeCluster( ncores , outfile = "" )
registerDoParallel( cl )
res <- foreach( j = 1:100 , .verbose = TRUE , .inorder= FALSE ) %dorng%{
d <- matrix( rnorm( 1e3 , j ) , nrow = 1 )
conn <- file( "~/output.txt" , open = "a" )
write.table( d , conn , append = TRUE , col.names = FALSE )
close( conn )
}
我正在寻找执行此操作的最佳方法,或者是否有最好的方法。也许 R 和 foreach 会自动处理我所说的写锁问题?
谢谢。
【问题讨论】:
-
不知道 R,我无法给出明确的答案,但是使用其他语言的一种有效方法是将一个线程专用于 IO,并为该 IO 线程设置一个写入命令队列来处理。该线程可以批量写入,从而减少它所花费的时间。
-
基本上,这将是生产者-消费者模式的一个实例
-
@didierc 感谢您的建议。我应该明确表示我正在寻找以
R为中心的答案。尤其是在具有多个内核的多个节点尝试访问网络共享上的同一文件的情况下。也许我发布的内容已经足够了。 TBH 我可能应该找到一个场景,它首先坏了,但我在抢先! -
您没有做错任何事情:您已正确标记了您的问题。但没有看到很多答案,我想我可能会以某种方式帮助你
-
如果您使用的是 POSIX 文件系统并且您的追加小于 PIPE_BUF 字节(Linux 上为 4k),那么追加操作是原子的。见Is file append atomic in UNIX?。这是假设 R 不会将输入分成多个块。
标签: r file-io foreach parallel-processing