21

ドキュメントには、バッファリングのデフォルト値は次のように記載されてい ますIf omitted, the system default is used。現在 Red Hat Linux 6 を使用していますが、システムに設定されているデフォルトのバッファリングがわかりません。

システムのバッファリングをどのように決定するかについて、誰か教えてもらえますか?

4

3 に答える 3

30

2.7 ドキュメントにリンクしているので、2.7 を使用していると思います。(Python 3.x では、より多くのバッファリングが Python レベルで公開されるため、これはすべてより簡単になります。)

open(POSIX システムで) 実際に行うことはすべてcallfopenであり、次に、何かを渡した場合bufferingsetvbuf. fopen何も渡していないので、C 標準ライブラリに依存するからのデフォルト バッファで終わるだけです。(詳細については、ソースを参照してください。 nobufferingを指定すると、 -1 が に渡されます。これは、 でPyFile_SetBufSizeない限り何もしませんbufsize >= 0。)

glibcのsetvbufmanpageを読むと、バッファリング関数をまったく呼び出さない場合は次のように説明されています。

通常、すべてのファイルはブロック バッファリングされます。ファイルに対して最初の I/O 操作が発生すると、malloc(3) が呼び出され、バッファーが取得されます。

取得されるバッファのサイズは示されていないことに注意してください。これは意図的なものです。これは、実装がスマートで、さまざまなケースに応じてさまざまなバッファー サイズを選択できることを意味します。(BUFSIZ定数がありますが、これは のようなレガシー関数を呼び出す場合にのみ使用されますsetbuf。それ以外の場合に使用されることは保証されていません。)

それで、何起こるのですか?glibc のソースを見ると、最終的にはマクロ_IO_DOALLOCATEを呼び出します。このマクロはフックできます (または、glibc は C++ streambuf と C stdio バッファリングを統合するため、オーバーライドできます) _IO_BUFSIZE。プラットフォーム固有のマクロ_G_BUFSIZE、つまり8192.

もちろん、一般的なソースを信頼するよりも、自分のシステムのマクロを追跡したいでしょう。


この情報を取得する適切な方法が文書化されていないのはなぜだろうかと思うかもしれません。おそらくそれは、あなたが気にする必要がないからです。特定のバッファ サイズが必要な場合は、手動で設定します。システムが最もよく知っていると信じるなら、ただそれを信頼してください。実際にカーネルや libc に取り組んでいない限り、誰が気にしますか? 理論的には、これは、ファイルのファイルシステムのブロックサイズに基づいて、または実行中の統計データに基づいて bufsize を選択するなど、システムがここでスマートな何かを実行できる可能性も残していますが、Linux/glibc のようには見えません。 、FreeBSD、または OS X は、定数を使用する以外のことを行います。そして、それはほとんどのアプリケーションにとって実際には問題にならないからです。

于 2013-08-12T19:12:35.803 に答える
23

それが正しい答えかどうかはわかりませんが、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
于 2014-10-24T04:45:58.313 に答える