documentationには、バッファリングのデフォルト値がIf omitted, the system default is used
であると記載されています。私は現在、Red Hat Linux 6を使用していますが、システムに設定されているデフォルトのバッファリングを把握することはできません。Linux上のファイルのデフォルトバッファサイズ
システムのバッファリングをどのように決定するのか、誰でも教えてください。
documentationには、バッファリングのデフォルト値がIf omitted, the system default is used
であると記載されています。私は現在、Red Hat Linux 6を使用していますが、システムに設定されているデフォルトのバッファリングを把握することはできません。Linux上のファイルのデフォルトバッファサイズ
システムのバッファリングをどのように決定するのか、誰でも教えてください。
2.7のドキュメントにリンクしているので、2.7を使用していると仮定しています。 (Python 3.xでは、バッファリングの多くがPythonレベルで公開されているため、これはもっと簡単になります)。
すべてopen
は実際には(POSIXシステムでは)fopen
と呼ばれ、if buffering
、setvbuf
のいずれかを渡しました。あなたは何も渡していないので、デフォルトのバッファーはfopen
から始まります。これはC標準ライブラリまでです。
setvbuf
manpageを読めば、それはあなたがバッファリング機能のいずれかを呼び出すことがない場合と説明し
(。。無buffering
で、それが通過する-1 PyFile_SetBufSize
に、bufsize >= 0
ない限り、何もしないその詳細についてはthe sourceを参照してください)
通常、すべてのファイルがブロックバッファされます。最初のI/O操作がファイルで発生すると、
malloc
(3)が呼び出され、バッファが取得されます。
どのサイズのバッファが得られるかはわかりません。これは意図的です。実装がスマートになり、異なるケースに対して異なるバッファサイズを選択できることを意味します。 (BUFSIZ
定数がありますが、あなたはsetbuf
などのレガシー関数を呼び出すときにのみ使われています;他の場合に使用される保証はないです)だから、
、は何が起こるのでしょうか?さて、glibcのソースを見ると、最終的にglibcがC++のstreambufとCのstdioのバッファリングを統一しているため、フック(またはオーバーライド)できるマクロ_IO_DOALLOCATE
が呼び出されますが、最終的には別名である_IO_BUFSIZE
のbufを割り当てますプラットフォーム固有のマクロ_G_BUFSIZE
は、8192
です。
もちろん、汎用ソースを信頼するのではなく、自分のシステムでマクロをトレースしたいと思うでしょう。
なぜこの情報を得るための文書化された方法がないのだろうか。おそらく、あなたが気にするはずがないからです。特定のバッファサイズが必要な場合は、手動で設定します。あなたがシステムが最もよく知っていると信じているならば、信頼してください。あなたが実際にカーネルやlibcで作業しているのでなければ、誰が気にしますか?理論的には、linux/glibcのようには見えませんが、ファイルのファイルシステムのブロックサイズに基づいてbufsizeを選ぶか、実行中の統計データに基づいてシステムをスマートにする可能性もあります、FreeBSD、またはOS Xは、定数を使用する以外は何もしません。ほとんどの場合、それは実際にほとんどのアプリケーションにとって重要ではないためです。 (あなた自身がテストしたいかもしれません - いくつかのバッファ付きI/Oバウンドスクリプトで1KBから2MBまでの範囲の明示的なバッファサイズを使用し、パフォーマンスの違いを確認してください。)
#include <stdio.h>
int main(int argc, char* argv[]){
printf("%d\n", BUFSIZ);
return 0;
}
私はこれを見つけるために 'man setvbuf'を行いました。 setvbufはドキュメントページの脚注です。
いいえ、それはデフォルトのバッファサイズであることが保証されないです。 'setbuf'のようなレガシー関数に使われるバッファーサイズだけです。 – abarnert
その場合、引数はそれほど役に立ちません。 [2] \t現在、バッファサイズを指定すると、setvbuf()を持たないシステムには影響しません。バッファサイズを指定するインタフェースは、setvbuf()を呼び出すメソッドを使用して実行されません。これは、I/Oが実行された後にコアがダンプされる可能性があるためです。 – seanmcl
どちらの議論? 'setvbuf(3)'に脚注があるところはどこのシステムですか?第3に、 'setvbuf'が利用できない場合、[CPython 2.7は' setbuf'](http://hg.python.org/cpython/file/2.7/Objects/fileobject.c#l509)を非常にはっきりと呼びます。それは効果がありません。 (正の値は 'setbuf'のみのシステムでは他の正の値と同じ効果がありますが、それでもやはり確かに_no_効果ではありません。)そして最後に、' setvbuf'は '_s_ available 'それができない議論は疑問です。 – abarnert
私はそれが正しい答えだか分からないけどpython 3.0 libraryとpython 20 libraryの両方がデフォルトはopen()
のためにドキュメントに記述されているのと同じ方法でio.DEFAULT_BUFFER_SIZE
を記述する。一致?
ない場合は、私のための答えは:
$ 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
大きな説明abarnert!ありがとう。 – falconepl