2011-07-15 3 views
1

バッファされていないファイルI/Oを使用して大量のデータをディスクに書き込んだ結果(少なくともオペレーティングシステムレベル以上の場合)バッファされていないファイルI/Oの結果

詳細:

私はそのstdoutとstderrをキャプチャし、ファイルに書き込む、コードの別の部分を実行しますRubyスクリプトを書いています。どうやら(少なくともRubyでは)stderrはバッファリングされておらず、stdoutはバッファされています。私の場合stderr行がいくつかのstdout行の前に印刷されるため、アウト・オブ・オーダーの結果になります。

解決策は、コードのこの部分にバッファリングされていないIO(IO.sync = true)を使用することです。しかし、スクリプトが実行しているコードは、大量のテキストをディスクに書き込むことになります。だから私は、結果がRubyバッファ(OSバッファとそれ以下のもの)を使用しないことが何であるのだろうと思っています。それが重要なのであれば、どうすれば注文問題を回避できますか?

答えて

1

バッファリングされていないI/Oは、書き込み操作の回数が少なく、大量書き込み操作の状況が逆になるとバッファI/Oよりも遅くなります。 1回の操作あたり約1,000〜10,000バイトの中間範囲ではそれほど大きな違いはありません。

操作が整列しているときのパフォーマンスが若干向上します

0

IO.syncは、バッファの自動フラッシュを切り替えますが、まだバッファされていることは変わりません。

STDERR.syswrite("Look ma, no buffers") 

をドキュメントが言うように、あなたはバッファ付きまたはバッファなしのどちらか選んで、それに固執する、ことができミキシングとマッチング等の必要があります:あなたの代わりにお勧めします何

は完全にバッファリングシステムをバイパスし、代わりにIO#syswriteを使用することです問題を引き起こす。

+0

多分私は間違った用語を使用しています。 'syswrite'を使用する必要はありません。ストリームを単にフラッシュするだけで私の問題が解決されます(リダイレクトされたstdout/stderrの順序が間違っています)。私の質問は、 'IO.sync'が' true'の間に大量のテキストをディスクに書き込むとどうなりますか? – jrdioko

+0

バッファーがいっぱいになったらバッファーが自動的にフラッシュされることを覚えておいてください。書き込み量が頻繁にその限界に達すると、その差は軽微です。通常、バッファーは1〜2KB程度です。 – tadman

関連する問題