web-dev-qa-db-ja.com

pythonはどれくらいの頻度でファイルにフラッシュしますか?

  1. Pythonはどれくらいの頻度でファイルにフラッシュしますか?
  2. Pythonはどれくらいの頻度で標準出力にフラッシュしますか?

(1)についてはよくわかりません。

(2)については、Pythonが新しい行ごとにstdoutにフラッシュされると思います。しかし、stdoutをオーバーロードしてファイルにする場合、頻繁にフラッシュしますか?

193
Tim McJilton

ファイル操作の場合、Pythonは、特に設定しない限り、オペレーティングシステムのデフォルトのバッファリングを使用します。バッファサイズ、バッファなし、またはラインバッファを指定できます。

たとえば、関数openはバッファサイズの引数を取ります。

http://docs.python.org/library/functions.html#open

「オプションのバッファリング引数は、ファイルに必要なバッファサイズを指定します。」

  • 0はバッファなしを意味し、
  • 1は行バッファリングを意味し、
  • その他の正の値は、(ほぼ)そのサイズのバッファーを使用することを意味します。
  • ネガティブバッファリングは、システムデフォルトを使用することを意味します。通常は、ttyデバイスではラインバッファリングされ、他のファイルでは完全にバッファリングされます。
  • 省略すると、システムのデフォルトが使用されます。

コード:

bufsize = 0
f = open('file.txt', 'w', buffering=bufsize)
287
Corey Goldberg

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を使用して出力ファイルを作成するときに、これが役立つことがわかりました。

152
kortina

これがpythonにも当てはまるかどうかはわかりませんが、実行しているオペレーティングシステムによって異なると思います。

たとえば、Linuxでは、ターミナルへの出力は改行でバッファをフラッシュしますが、ファイルへの出力では、バッファがいっぱいになったときにのみフラッシュします(デフォルト)。これは、バッファーをフラッシュする回数が少ない方が効率的であり、ユーザーがファイル内の改行で出力がフラッシュされない場合に気付く可能性が低いためです。

必要な場合は、出力を自動フラッシュできる場合があります。

編集:pythonでこのように自動フラッシュすると思います( here に基づく)

#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()
13
KLee1

Ioモジュールから読み取り専用のDEFAULT_BUFFER_SIZE属性を呼び出して、デフォルトのバッファーサイズを確認することもできます。

import io
print (io.DEFAULT_BUFFER_SIZE)
11
N Randhawa

OPが好むものを選択するまでの別のアプローチを次に示します。

以下のコードを他のコードの前の__init__.pyファイルに含めると、printおよびエラーが出力されたメッセージはAbletonのLog.txtに記録されなくなり、ディスク上のファイルが分離されます。

import sys

path = "/Users/#username#"

errorLog = open(path + "/stderr.txt", "w", 1)
errorLog.write("---Starting Error Log---\n")
sys.stderr = errorLog
stdoutLog = open(path + "/stdout.txt", "w", 1)
stdoutLog.write("---Starting Standard Out Log---\n")
sys.stdout = stdoutLog

(Macの場合、#username#をユーザーフォルダーの名前に変更します。Windowsでは、ユーザーフォルダーへのパスの形式は異なります)

ディスク上のファイルが変更されたときにコンテンツを更新するテキストエディターでファイルを開くと(Macの例:TextEditは変更されませんがTextWranglerは変更されます)、ログがリアルタイムで更新されます。

クレジット:このコードは、主にNathan RamellaによるliveAPIコントロールサーフェススクリプトからコピーされました

1
Mattijs