在python中是否存在用于写入文件的COMMIT模拟?

时间:2009-03-03 21:33:02

标签: python file-io commit buffering

我有一个文件打开写入,一个进程运行了几天 - 在相对随机的时刻写入文件。我的理解是 - 直到我做file.close() - 有可能没有真正保存到磁盘。这是真的吗?

如果系统在主进程尚未完成时崩溃怎么办?是否有一种方法可以做一次提交...说 - 10分钟(我自己称之为提交 - 不需要运行计时器)? file.close()和open(文件,'a')是唯一的方法,还是有更好的选择?

4 个答案:

答案 0 :(得分:19)

您应该可以使用file.flush()来执行此操作。

答案 1 :(得分:3)

如果您不想杀死当前进程以添加f.flush()(听起来它已经运行了几天?),您应该没问题。如果您看到要写的文件越来越大,那么您将不会丢失该数据......

来自Python文档:

  

<强>写(STR)       将字符串写入文件。没有回报价值。由于缓冲,   字符串可能实际上不会出现   文件直到flush()或close()   方法被称为。

听起来Python的缓冲系统会自动刷新文件对象,但在发生这种情况时无法保证。

答案 2 :(得分:2)

要确保您的数据已写入磁盘,请使用file.flush(),然后使用os.fsync(file.fileno())

答案 3 :(得分:2)

正如已经说过的那样,使用.flush()方法强制写出缓冲区,但是避免使用大量的flush调用,因为这实际上会减慢你的写入速度(如果应用程序依赖于快速写入)因为你将强制你的文件系统写出小于它的缓冲区大小的变化,这可能会让你跪倒在地。 :)