Есть ли в Python аналог COMMIT для записи в файл? - PullRequest
7 голосов
/ 04 марта 2009

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

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

Ответы [ 4 ]

19 голосов
/ 04 марта 2009

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

3 голосов
/ 04 марта 2009

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

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

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

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

2 голосов
/ 04 марта 2009

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

2 голосов
/ 04 марта 2009

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

...