Вопрос-Ответ

How often does python flush to a file?

Как часто python выполняет сброс в файл?

  1. Как часто Python выполняет сброс в файл?

  2. Как часто Python выполняет сброс в стандартный вывод?

Я не уверен насчет (1).

Что касается (2), я полагаю, что Python выполняет сброс в стандартный вывод после каждой новой строки. Но, если вы перегружаете стандартный вывод в файл, выполняет ли он сброс так же часто?

Переведено автоматически
Ответ 1

Для файловых операций Python использует буферизацию операционной системы по умолчанию, если вы не настроили ее иначе. Вы можете указать размер буфера, без буферизации или с буферизацией строк.

Например, функция open принимает аргумент размера буфера.

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

"Необязательный аргумент буферизации указывает желаемый размер буфера файла:"


  • 0 означает небуферизованный,

  • 1 означает, что строка буферизована,

  • любое другое положительное значение означает использование буфера (приблизительно) такого размера.

  • Отрицательная буферизация означает использование системного значения по умолчанию, которое обычно буферизуется по строкам для устройств tty и полностью буферизуется для других файлов.

  • Если параметр опущен, используется системное значение по умолчанию.

код:

bufsize = 0
f = open('file.txt', 'w', buffering=bufsize)
Ответ 2

Вы также можете принудительно сбросить буфер в файл программно с помощью 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.

Ответ 3

You can also check the default buffer size by calling the read only DEFAULT_BUFFER_SIZE attribute from io module.

import io
print (io.DEFAULT_BUFFER_SIZE)
Ответ 4

I don't know if this applies to python as well, but I think it depends on the operating system that you are running.

On Linux for example, output to terminal flushes the buffer on a newline, whereas for output to files it only flushes when the buffer is full (by default). This is because it is more efficient to flush the buffer fewer times, and the user is less likely to notice if the output is not flushed on a newline in a file.

You might be able to auto-flush the output if that is what you need.

EDIT: I think you would auto-flush in python this way (based
from 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()
python file