6

使用する大きなファイルがいくつかあり、それらにアクセスするためにいくつかの異なるI/O機能を使用しています。最も一般的なものはbigmemoryパッケージです。

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

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

答えを超えて一般化できるのであれば、bigmemory他のメモリマッピング関数やI / Oストリームに依存することがあるので、それは素晴らしいことです。

バッファがフラッシュされたかどうかを確認するための適切な解決策がない場合、バッファがフラッシュされたと見なすことができる場合がありますか?つまり、を使用する以外にflush()

更新:これらはすべてバイナリ接続であることを明確にする必要があります。@RichieCottonはisIncomplete()、ヘルプドキュメントにはテキスト接続についてのみ言及されていますが、注意しました。それがバイナリ接続に使用できるかどうかは明らかではありません。

4

2 に答える 2

0

私自身の答えを提示しますが、もっと明確なものは何でも歓迎します。

これまで見てきたことから、さまざまな接続関数(たとえば、、、、、、、、および(とりわけ)は、ファイル、パイプ、URL、およびその他のいくつかのものなどの特定の接続タイプに基づいfileopencloseますflushisOpenisIncomplete

対照的に、bigmemory独自の接続タイプがあり、bigmemoryオブジェクトはオペレーティングシステムバッファ用のメモリアドレス用のスロットを持つS4オブジェクトです。そこに配置されると、OSがそれらのバッファのフラッシュを担当します。これはOSの責任であるため、「ダーティ」バッファに関する情報を取得するには、RではなくOSと対話する必要があります。

したがって、bigmemoryデータはカーネルバッファに格納されるため、答えは「いいえ」ですが、STDIOを介して処理される(つまり「ユーザースペース」に格納される)他の接続では「はい」になる場合があります。

OS /カーネル側の詳細については、SOに関するこの質問を参照してください。私は、バッファフラッシングの好奇心を生み出しているいくつかのプログラム(R + bigmemoryだけでなく)を調査しており、そのスレッドは、カーネル側についての啓蒙に役立ちました。

于 2011-08-22T15:28:39.150 に答える
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)

(help(connections)ファイルから変更されました。)

于 2011-08-08T23:32:00.050 に答える