2011-08-08 19 views
6

私は大きなファイルをいくつか用意しており、それらにアクセスするためにいくつかの異なるI/O機能を使用しています。最も一般的なのはbigmemoryパッケージです。バッファがフラッシュされているかどうかのテストR

ファイルに書き込むときに、出力バッファをフラッシュする難しい方法を学びました。そうしないと、データが保存されたかどうかにかかわらず、すべてのベットがオフになります。しかし、これは非常に長い待ち時間につながる可能性がありますが、bigmemoryは何分(何分)かかります。なぜこのようなことが起こるのか分かりません。いつも起こるとは限らず、簡単に再現されません。

特に、bigmemoryの場合、I/OバッファがRでフラッシュされているかどうかを判断する方法はありますか?オペレーティングシステムが重要な場合は、そのように答えを制約することを自由にしてください。

回答がbigmemoryを超えて一般化できる場合は、他のメモリマッピング関数やI/Oストリームに依存することがあります

バッファがフラッシュされたかどうかをチェックする良い解決策がない場合、バッファがフラッシュされたとみなすことができるケースがありますか?私。 flush()を使用しています。

アップデート:これらはすべてバイナリ接続であることを明確にする必要があります。 @ RichieCottonはisIncomplete()と書いてありましたが、ヘルプドキュメントではテキスト接続についてしか触れていません。バイナリ接続で使用できるかどうかは不明です。

+0

'bigmemory'での使用についてはわかりませんが、' isIncomplete'は通常の接続では機能します。 –

+0

ありがとう!接続に関する非常に限定されたヘルプ情報は、isIncompleteがテキスト接続の出力に適していることだけを示しています。バイナリ接続で運が良かったですか? – Iterator

答えて

0

私は前方に自分の答えを出してあげるが、私は明確である何でも歓迎します。

私がこれまで見たことから、さまざまな接続機能(例: fileopenclose,flush,isOpen、およびisIncomplete(とりわけ)は、特定の接続タイプに基づく。ファイル、パイプ、URL、およびその他のいくつかのものが含まれます。これに対して、bigmemoryは独自の接続タイプを持ち、bigmemoryオブジェクトはオペレーティング・システム・バッファ用のメモリ・アドレス用のスロットを持つS4オブジェクトです。そこに配置されると、OSはそれらのバッファをフラッシュすることを担当します。それはOSの責任であるため、 "汚い"バッファに関する情報を得るには、RではなくOSとのやりとりが必要です。

したがって、データはカーネルバッファに格納されるため、bigmemoryの答えは "no" STDIOを介して処理される(すなわち、「ユーザ空間」に格納される)他の接続に対しては、「はい」とすることができる。

OS /カーネル側の詳細については、this question on SOを参照してください。私は、バッファフラッシングの好奇心を作り出しているプログラム(R + bigmemoryだけではない)を調査しています。そのスレッドは、カーネル側のことについて私に教えてくれました。

0

これはバイナリファイルでisIncomplete()が機能することをより確信していますか?

# R process 1 
zz <- file("~/test", "wb") 
writeBin(c(1:100000),con=zz) 
close(zz) 

# R process 2 
zz2 <- file("~/test", "rb") 
inpp <- readBin(con=zz2, integer(), 10000) 
while(isIncomplete(con2)) {Sys.sleep(1); inpp <- c(inpp, readBin(zz2),integer(), 10000)} 
close(zz2) 

(ヘルプ(接続)ファイルから変更された。)

+0

これをテストしていただきありがとうございます。しかし、私が誤解していない限り、あなたの例では、入力バッファの場合にのみ使用しています。私はそれが出力バッファ上で動作することは本当に明確ではない。私は同じ方法でテストできるかどうかを判断するために出力バッファリングに慣れていません。私はドキュメントを超えて消極的です。その振る舞いが決定的ではなくランダムであれば、破損したデータが危険にさらされます。私はその道を歩いているので、私は慎重です。 :) – Iterator

+0

さらにテストした後、 'bigInMemory'オブジェクトでisIncomplete()が動作しないと思います。オブジェクトは接続ではなく、ある種のポインタであるようです。 :( – Iterator

+0

提案と例をありがとう。この場合、バッファはRの外で処理されることがわかります。 – Iterator

関連する問題