что именно делает python file.flush ()? - PullRequest
122 голосов
/ 20 августа 2011

Я нашел это в документации Python для файловых объектов :

flush () не обязательно записывает данные файла на диск.Используйте flush (), а затем os.fsync (), чтобы убедиться в этом.

Итак, мой вопрос: что именно делает Python flush?Я думал, что это заставляет записывать данные на диск, но теперь я вижу, что это не так.Зачем?

Ответы [ 4 ]

200 голосов
/ 20 августа 2011

Обычно используется два уровня буферизации:

  1. Внутренние буферы
  2. Буферы операционной системы

Внутренние буферы - это буферы, созданные во время выполнения /библиотека / язык, на котором вы программируете, и предназначена для ускорения процесса, избегая системных вызовов для каждой записи.Вместо этого, когда вы записываете в объект файла, вы записываете в его буфер, и всякий раз, когда буфер заполняется, данные записываются в фактический файл с использованием системных вызовов.

Однако из-за буферов операционной системыэто может не означать, что данные записываются на диск .Это может просто означать, что данные копируются из буферов, поддерживаемых вашей средой выполнения, в буферы, поддерживаемые операционной системой.

Если вы что-то пишете, и это заканчивается в буфере (только), и питаниеОбрезается на вашем компьютере, что данные не находятся на диске, когда машина выключается.

Итак, чтобы помочь вам, у вас есть методы flush и fsync для их соответствующих объектов.

Первый, flush, просто записывает любые данные, которые хранятся в программном буфере, в текущий файл.Как правило, это означает, что данные будут скопированы из буфера программы в буфер операционной системы.

В частности, это означает, что если другой процесс имеет тот же файл, открытый для чтения, он сможет получить доступ к даннымты просто залил файл.Однако это не обязательно означает, что оно «постоянно» хранится на диске.

Для этого вам необходимо вызвать метод os.fsync, который обеспечивает синхронизацию всех буферов операционной системы с запоминающими устройствами, с которыми они работают.другими словами, этот метод будет копировать данные из буферов операционной системы на диск.

Как правило, вам не нужно беспокоиться ни об одном из этих методов, но если вы находитесь в сценарии, когда паранойя ото, что в действительности оказывается на диске, - это хорошо, вы должны сделать оба вызова в соответствии с инструкциями.


Добавление в 2018.

Обратите внимание, что диски с механизмами кэширования теперь встречаются гораздо чаще, чемеще в 2013 году, так что теперь еще больше уровней кеширования и буферов.Я предполагаю , что эти буферы также будут обрабатываться вызовами sync / flush, но я действительно не знаю.

9 голосов
/ 20 августа 2011

Поскольку операционная система может этого не делать. Операция сброса помещает данные файла в файловый кеш в ОЗУ, и оттуда задача ОС - фактически отправить их на диск.

6 голосов
/ 20 августа 2011

Сбрасывает внутренний буфер, что должно заставить ОС записывать буфер в файл. [1] Python использует буферизацию операционной системы по умолчанию, если вы не настроите ее, в противном случае.

Но иногда ОС все же решает не сотрудничать. Особенно с такими замечательными вещами, как задержки записи в Windows / NTFS. По сути, внутренний буфер очищен, но буфер ОС все еще удерживает его. Поэтому вы должны указать ОС записать его на диск с os.fsync() в этих случаях.

[1] http://docs.python.org/library/stdtypes.html

0 голосов
/ 12 декабря 2018

По сути, flush () очищает ваш буфер ОЗУ, его реальная сила в том, что он позволяет вам продолжать запись в него впоследствии - но его не следует рассматривать как лучшую / самую безопасную функцию записи в файл.Это очищает вашу оперативную память для получения большего количества данных, вот и все.Если вы хотите обеспечить безопасную запись данных в файл, используйте вместо этого close ().

...