2013-08-12 2 views
15

documentationには、バッファリングのデフォルト値がIf omitted, the system default is usedであると記載されています。私は現在、Red Hat Linux 6を使用していますが、システムに設定されているデフォルトのバッファリングを把握することはできません。Linux上のファイルのデフォルトバッファサイズ

システムのバッファリングをどのように決定するのか、誰でも教えてください。

答えて

24

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

すべてopenは実際には(POSIXシステムでは)fopenと呼ばれ、if bufferingsetvbufのいずれかを渡しました。あなたは何も渡していないので、デフォルトのバッファーはfopenから始まります。これはC標準ライブラリまでです。

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

+0

大きな説明abarnert!ありがとう。 – falconepl

-1
#include <stdio.h> 

int main(int argc, char* argv[]){ 
    printf("%d\n", BUFSIZ); 
    return 0; 
} 

私はこれを見つけるために 'man setvbuf'を行いました。 setvbufはドキュメントページの脚注です。

+0

いいえ、それはデフォルトのバッファサイズであることが保証されないです。 'setbuf'のようなレガシー関数に使われるバッファーサイズだけです。 – abarnert

+0

その場合、引数はそれほど役に立ちません。 [2] \t現在、バッファサイズを指定すると、setvbuf()を持たないシステムには影響しません。バッファサイズを指定するインタフェースは、setvbuf()を呼び出すメソッドを使用して実行されません。これは、I/Oが実行された後にコアがダンプされる可能性があるためです。 – seanmcl

+0

どちらの議論? '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

11

私はそれが正しい答えだか分からないけどpython 3.0 librarypython 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 
関連する問題