- Python はどのくらいの頻度でファイルにフラッシュしますか?
- Python はどのくらいの頻度で標準出力にフラッシュしますか?
(1)についてはわかりません。
(2) に関しては、Python は改行ごとに stdout にフラッシュすると思います。しかし、stdout をファイルにオーバーロードすると、頻繁にフラッシュされますか?
ファイル操作の場合、特に設定しない限り、Python はオペレーティング システムのデフォルトのバッファリングを使用します。バッファー サイズ、バッファーなし、またはライン バッファーを指定できます。
たとえば、関数 open はバッファ サイズの引数を取ります。
http://docs.python.org/library/functions.html#open
"オプションの buffering 引数は、ファイルの望ましいバッファ サイズを指定します:"
コード:
bufsize = 0
f = open('file.txt', 'w', buffering=bufsize)
メソッドを使用して、プログラムでバッファをファイルに強制的にフラッシュすることもできますflush()
。
with open('out.log', 'w+') as f:
f.write('output is ')
# some work
s = 'OK.'
f.write(s)
f.write('\n')
f.flush()
# some other work
f.write('done\n')
f.flush()
で出力ファイルをテーリングするときにこれが役立つことがわかりましたtail -f
。
これがpythonにも当てはまるかどうかはわかりませんが、実行しているオペレーティングシステムに依存すると思います。
たとえば Linux では、端末への出力は改行でバッファーをフラッシュしますが、ファイルへの出力の場合は、バッファーがいっぱいになった場合にのみフラッシュします (デフォルト)。これは、バッファーをフラッシュする回数が少ない方が効率的であり、出力がファイルの改行でフラッシュされていない場合にユーザーが気付く可能性が低いためです。
必要な場合は、出力を自動フラッシュできる場合があります。
編集:この方法でPythonで自動フラッシュすると思います(ここに基づいています)
#0 means there is no buffer, so all output
#will be auto-flushed
fsock = open('out.log', 'w', 0)
sys.stdout = fsock
#do whatever
fsock.close()
io モジュールから読み取り専用の DEFAULT_BUFFER_SIZE 属性を呼び出して、デフォルトのバッファ サイズを確認することもできます。
import io
print (io.DEFAULT_BUFFER_SIZE)