есть ли аналог COMMIT в python для записи в файл?

У меня есть файл, открытый для записи, и процесс выполняется в течение нескольких дней — что-то записывается в файл в относительно случайные моменты. Насколько я понимаю, пока я не выполню file.close(), есть шанс, что на диске ничего не будет сохранено. Это правда?

Что делать, если система падает, когда основной процесс еще не завершен? Есть ли способ делать фиксацию раз в... скажем -- 10 минут (и я сам называю это фиксацией -- нет необходимости запускать таймер)? Является ли file.close() и open(file,'a') единственным способом или есть лучшие альтернативы?


person user63503    schedule 03.03.2009    source источник


Ответы (4)


Вы должны иметь возможность использовать file.flush() для этого.

person zweiterlinde    schedule 03.03.2009
comment
И если вы хотите, чтобы ОС фактически немедленно записывала его на диск (вместо того, чтобы потенциально оставаться в буферах ОС и теряться при внезапном отключении питания), добавьте os.fsync(file.fileno()) после flush; flush сбрасывает буферы пользовательского режима Python, fsync сбрасывает буферы режима ядра ОС (и часто предлагает базовому аппаратному обеспечению диска немедленно записать его, хотя многие диски лгут, поэтому он может немного остаться в буферах диска) . - person ShadowRanger; 14.10.2020

Если вы не хотите убивать текущий процесс, чтобы добавить f.flush() (похоже, он работает уже несколько дней?), вы должны быть в порядке. Если вы видите, что файл, в который вы записываете, становится больше, вы не потеряете эти данные...

Из документов Python:

write(str) Записать строку в файл. Нет возвращаемого значения. Из-за буферизации строка может фактически не отображаться в файле до тех пор, пока не будет вызван метод flush() или close().

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

person Jason Coon    schedule 03.03.2009

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

person Benjamin Peterson    schedule 03.03.2009

Как уже было сказано, используйте метод .flush() для принудительной записи из буфера, но избегайте использования большого количества вызовов для сброса, так как это может фактически замедлить вашу запись (если приложение полагается на быструю запись), поскольку вы' заставит вашу файловую систему записывать изменения, которые меньше размера ее буфера, что может поставить вас на колени. :)

person Christian Witts    schedule 04.03.2009