web-dev-qa-db-ja.com

Linux上のファイルのデフォルトのバッファサイズ

documentation は、バッファリングのデフォルト値がIf omitted, the system default is usedであることを示しています。現在RedHat Linux 6を使用していますが、システムに設定されているデフォルトのバッファリングを理解できません。

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

19
name_masked

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の範囲の明示的なバッファサイズを使用して、パフォーマンスの違いを確認してください。)

27
abarnert

正しい答えかどうかはわかりませんが、 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
_
16
coreyh