documentation は、バッファリングのデフォルト値がIf omitted, the system default is used
であることを示しています。現在RedHat Linux 6を使用していますが、システムに設定されているデフォルトのバッファリングを理解できません。
システムのバッファリングを決定する方法について誰かに教えてもらえますか?
2.7のドキュメントにリンクしているので、2.7を使用していると想定しています。 (Python 3.xでは、Pythonレベルでより多くのバッファリングが公開されるため、これはすべてはるかに簡単になります。)
open
が(POSIXシステムで)実際に行うのは、fopen
を呼び出すことだけです。次に、buffering
に何かを渡した場合は、setvbuf
です。何も渡さないので、最終的にはfopen
からのデフォルトのバッファになります。これは、C標準ライブラリまでです。 (詳細については、 ソース を参照してください。buffering
がない場合、-1をPyFile_SetBufSize
に渡します。これは、bufsize >= 0
以外は何もしません。)
glibc setvbuf
manpage を読むと、バッファリング関数をまったく呼び出さない場合は次のように説明されます。
通常、すべてのファイルはブロックバッファリングされます。ファイルに対して最初のI/O操作が発生すると、
malloc
(3)が呼び出され、バッファーが取得されます。
どのサイズのバッファが取得されるかは示されていないことに注意してください。これは意図的なものです。これは、実装がスマートで、ケースごとに異なるバッファサイズを選択できることを意味します。 (BUFSIZ
定数がありますが、これはsetbuf
などのレガシー関数を呼び出す場合にのみ使用されます。それ以外の場合に使用されるとは限りません。)
では、は何が起こりますか?さて、glibcソースを見ると、最終的にはマクロ _IO_DOALLOCATE
が呼び出されます。これはフックできます(または、glibcがC++ streambufとCstdioバッファリングを統合するため、オーバーライドできます)が、最終的にはプラットフォーム固有のマクロのエイリアスである_IO_BUFSIZE
のbufを割り当てます _G_BUFSIZE
、つまり8192
です。
もちろん、一般的なソースを信頼するのではなく、独自のシステムでマクロを追跡したい場合があります。
この情報を取得するための適切な文書化された方法がないのはなぜか疑問に思われるかもしれません。おそらくそれはあなたが気にすることになっていないからです。特定のバッファサイズが必要な場合は、手動で設定します。システムが最もよく知っていると信頼する場合は、それを信頼してください。実際にカーネルまたはlibcで作業しているのでない限り、誰が気にしますか?理論的には、これは、ファイルのファイルシステムのブロックサイズに基づいて、または実行中の統計データに基づいてbufsizeを選択するなど、システムがここでスマートなことを実行できる可能性も残しますが、linux/glibcのようには見えません、FreeBSD、またはOS Xは、定数を使用する以外のことを行います。そして、ほとんどの場合、それはほとんどのアプリケーションにとって実際には問題ではないためです。 (自分でテストすることをお勧めします。バッファリングされたI/Oバウンドスクリプトで1KBから2MBの範囲の明示的なバッファサイズを使用して、パフォーマンスの違いを確認してください。)
正しい答えかどうかはわかりませんが、 python 3.0ライブラリ と python 20ライブラリ どちらも、デフォルトがドキュメントに記載されているのと同じ方法で_io.DEFAULT_BUFFER_SIZE
_を記述しています。 open()
の場合。一致?
そうでない場合、私にとっての答えは次のとおりです。
_$ python
>>> import io
>>> io.DEFAULT_BUFFER_SIZE
8192
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.1 LTS
Release: 14.04
Codename: trusty
_