2009-03-03 29 views
5

我有一個文件可以寫入,一個進程運行幾天 - 在相對隨機的時刻寫入文件。我的理解是 - 直到我做file.close() - 有一個機會沒有真正保存到磁盤。真的嗎?有沒有COMMIT模擬python寫入文件?

如果主進程還沒有完成時系統崩潰怎麼辦?有沒有一種方法可以每隔一段時間做一次提交 - 10分鐘(我自己稱這個提交 - 不需要運行計時器)?是file.close()和打開(文件,'a')唯一的方式,還是有更好的選擇?

回答

17

你應該可以使用file.flush()來做到這一點。

3

如果您不想殺死當前進程以添加f.flush()(這聽起來好像已經運行了幾天了),您應該沒問題。如果你看到你寫越來越大的文件,也不會丟失數據......

從Python文檔:

寫(STR) 一個字符串寫入該文件。沒有返回值。由於緩衝, 該字符串實際上可能不會顯示在 文件中,直到flush()或close() 方法被調用。

這聽起來像Python的緩衝系統會自動刷新文件對象,但不能保證這種情況發生時。

2

要確保您的數據已寫入磁盤,請使用file.flush(),然後使用os.fsync(file.fileno())

2

如前所述,使用.flush()方法強制寫出緩衝區,但避免使用大量調用來刷新,因爲這實際上會減慢寫入速度(如果應用程序依賴於快速寫入),因爲你會迫使你的文件系統寫入小於它的緩衝區大小的變化,這會使你跪下。 :)