9

ファイルへの書き込みに関する多くの質問を見てきましたが、テキスト ファイルを開き、いくつかのデータを追加してから、多くの接続から (つまり、並列で) 書き込みを行う場合に再度閉じる方法として、最も堅牢な方法は何か疑問に思っています。コンピューティング状況)、各接続がいつファイルに書き込みたいかを保証することはできません。

たとえば、デスクトップのコアのみを使用する次のおもちゃの例では、問題なく動作しているように見えますが、書き込みが長くなり、ファイルに書き込むプロセスの数が増えると、この方法が失敗する傾向があるかどうか疑問に思っています(特に、遅延が発生する可能性があるネットワーク共有全体)。

同時にファイルに書き込みたい他のスレーブプロセスが存在する可能性がある場合に、接続を開き、書き込み、閉じなければならない堅牢で決定的な方法を誰かが提案できますか?

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私が書き込みロックの問題と呼ぶものを自動的に処理しますか?

ありがとう。

4

3 に答える 3

6

foreach パッケージは、複数のワーカーが同時に同じファイルに書き込むのを防ぐファイル ロックのメカニズムを提供しません。その結果は、オペレーティング システムとファイル システムによって異なります。NFS などの分散ファイル システムを使用した場合の結果が特に心配です。

代わりに、出力ファイルを開く方法を変更して、ワーカーのプロセス ID を含めます。

conn <- file( sprintf("~/output_%d.txt" , Sys.getpid()) , open = "a" )

必要に応じて、foreach ループが返された後にファイルを連結できます。

もちろん、複数のマシンを使用している場合、同じプロセス ID を持つ 2 つのワーカーが存在する可能性があるためSys.info()[['nodename']]、たとえば を使用して、ファイル名にホスト名を含めることもできます。

于 2013-03-11T20:48:47.323 に答える
1

代わりに、おそらく次のようなことを試すことができます。

res <- foreach( j = 1:100 , .verbose = TRUE , .inorder= FALSE ) %dorng%{
    matrix( rnorm( 1e3 , j ) , nrow = 1 )
}

conn <- file("~/output.txt", open = "a")
apply(res, 1, function (x, output) {
    write.table( x , conn , append = TRUE , col.names = FALSE )
  }, conn)

close(conn)

ソース:データフレームの foreach 行

于 2013-03-09T14:02:12.240 に答える