7

フラットファイルの形式で一定のデータストリームを読み取るRscriptがあります。別のスクリプトがこのフラット ファイルを取得し、解析と処理を行ってから、結果を RDS 形式の data.frame として保存します。その後スリープし、プロセスを繰り返します。

saveRDS(tmp.df, file="H:/Documents/tweet.df.rds") #saving the data.frame

2 回目... n 回目の繰り返しでは、前の繰り返し以降にフラット ファイルに追加された新しい行のみをコードで処理します。ただし、デルタ ラインを永続的なデータ フレームに追加するには、それを読み込んで追加し、保存して元のデータを上書きする必要があります。

df2 <- readRDS("H:/Documents/tweet.df.rds") #read in permanent                      
tmp.df2 <- rbind(df2, tmp.df) #append new to existing
saveRDS(tmp.df2, file="H:/Documents/tweet.df.rds") #save it
rm(df2) #housecleaning
rm(tmp.df2) #housecleaning

RDS が読み取り/書き込み用に開かれているときはいつでも、そのファイルにアクセスしようとする別のプロセスが待機する必要があるため、このアプローチは危険です。ベース ファイルが大きくなるにつれて、リスクが高まります。

完全な置換ではなく追加を使用して、ファイルに保存された単一のデータフレームの反復更新を実現できるようなものはありappendRDSますか?

4

2 に答える 2

5

次のプロセスが引き継ぐ前に、接続を使用してプロセスを開閉することで、プロセスを保護できると思います。

con <- file("tmp.rds")
open(con)
df <- readRDS(con)
df.new <- rbind(df,df)
saveRDS(df.new, con)
close(con) 

アップデート:

ファイルへの接続が開いているかどうかをテストし、同時実行性に問題がある場合は少し待つように指示できます。

while(is.Open(con)) { # untested but something of this nature should work
sys.Sleep(2)
}
于 2012-12-28T23:22:41.367 に答える
1

単一の RDS ファイルではなく、一連の番号付き RDS ファイルをディレクトリで使用することに問題はありますか? データフレームは単に列のリストであるため、ファイル全体を書き換えずにデータフレームにRDSファイルを追加することはできないと思います。おそらく一度に1列ずつシリアル化され、最後の列のみが終了しますファイルの終わり近く。

単一のファイルに固執するが、RDS ファイルから一貫性のないデータを読み取るリスクを最小限に抑えたい場合は、それを読み取り、追加操作を実行してから一時ファイルに書き出し、一時ファイルの名前を元のファイルに変更します。終わったら名前。そうすれば、少なくともリスクの期間はファイルのサイズに依存しません. ファイルの名前を既存の名前に変更するときに、さまざまなファイルシステムによってどのような原子性が保証されているかについてはよくわかりませんが、おそらく saveRDS にかかる時間よりはましです。

于 2012-12-29T00:27:40.897 に答える