У меня есть файл, открытый для записи, и процесс выполняется в течение нескольких дней - что-то записывается в файл в относительно случайные моменты. Насколько я понимаю, пока я не выполню file.close(), есть шанс, что на диске ничего не будет сохранено. Это правда?
Что делать, если система падает, когда основной процесс еще не завершен? Есть ли способ делать фиксацию раз в... скажем -- 10 минут (и я сам называю это фиксацией -- нет необходимости запускать таймер)? Является ли file.close() и open(file,'a') единственным способом или есть лучшие альтернативы?
Ответ 2 · рейтинг 3 · Jason Coon
Если вы не хотите убивать текущий процесс, чтобы добавить f.flush() (похоже, он работает уже несколько дней?), вы должны быть в порядке. Если вы видите, что файл, в который вы записываете, становится больше, вы не потеряете эти данные...
Из документов Python:
write(str) Записать строку в файл. Нет возвращаемого значения. Из-за буферизации строка может фактически не отображаться в файле до тех пор, пока не будет вызван метод flush() или close().
Похоже, что система буферизации Python автоматически сбрасывает файловые объекты, но это не гарантируется, когда это произойдет.
Ответ 3 · рейтинг 2 · Benjamin Peterson
Чтобы убедиться, что ваши данные записаны на диск, используйте file.flush(), а затем os.fsync(file.fileno()).
Ответ 4 · рейтинг 2 · Christian Witts
Как уже было сказано, используйте метод .flush() для принудительной записи из буфера, но избегайте использования большого количества вызовов для сброса, так как это может фактически замедлить вашу запись (если приложение полагается на быструю запись), поскольку вы' заставит вашу файловую систему записывать изменения, которые меньше размера ее буфера, что может поставить вас на колени. :)