File.rush ()到底在做什么?

我在 Python 文件对象的文档中发现了这个:

flush()不一定将文件的数据写入磁盘。请使用 flush()后跟 os.fsync()以确保此行为。

所以我的问题是: Python 的 flush到底在做什么?我原以为它会强制将数据写入磁盘,但现在我看到它并没有这样做。为什么?

125685 次浏览

因为操作系统可能不会这样做。刷新操作迫使文件数据进入 RAM 中的文件缓存,然后由操作系统将其发送到磁盘。

通常涉及两个级别的缓冲:

  1. 内部缓冲
  2. 操作系统缓冲区

内部缓冲区是由您正在编程的运行时/库/语言创建的缓冲区,旨在通过避免每次写操作的系统调用来提高速度。相反,当您写入一个文件对象时,您写入它的缓冲区,并且每当缓冲区填满时,数据就会使用系统调用写入到实际的文件中。

但是,由于操作系统缓冲区的原因,这可能并不意味着数据是写入 转到磁盘的。这可能仅仅意味着数据从运行时维护的缓冲区复制到操作系统维护的缓冲区中。

如果您写了一些东西,它最终(仅)在缓冲区中,并且机器的电源被切断,那么当机器关闭时,该数据不在磁盘上。

因此,为了帮助解决这个问题,您需要在它们各自的对象上使用 flushfsync方法。

第一个,flush,将简单地写出在程序缓冲区中逗留到实际文件的任何数据。这通常意味着数据将从程序缓冲区复制到操作系统缓冲区。

具体来说,这意味着如果另一个进程打开了同一个文件以供读取,它将能够访问您刚刚刷新到该文件的数据。但是,这并不一定意味着它已经“永久”存储在磁盘上。

为此,您需要调用 os.fsync方法,该方法确保所有操作系统缓冲区与它们所用的存储设备同步,换句话说,该方法将把数据从操作系统缓冲区复制到磁盘。

通常不需要使用这两种方法中的任何一种,但是如果您处于对磁盘上实际结果的偏执是件好事的情况下,那么您应该按照指示进行这两个调用。


2018年增编。

请注意,带有缓存机制的磁盘现在比2013年更常见,因此现在涉及的缓存和缓冲区级别更高。我 假设这些缓冲区将处理的同步/刷新调用,以及,但我真的不知道。

它刷新内部缓冲区,这应该会导致操作系统将缓冲区写入文件。[1] Python 使用操作系统的默认缓冲区,除非您另外配置它。

但有时操作系统仍然选择不合作。特别是对于 Windows/NTFS 中的写延迟这样的奇妙的事情。基本上内部缓冲区是刷新的,但操作系统缓冲区仍然保留着它。因此,在这种情况下,必须告诉操作系统使用 os.fsync()将其写入磁盘。

[1] http://docs.python.org/library/stdtypes.html

从根本上说,flash ()清除了 RAM 缓冲区,它真正的强大之处在于,它允许您在以后继续写入内存——但它不应该被认为是最好/最安全的写入文件功能。它正在清洗你的内存以获取更多的数据,仅此而已。如果希望确保数据安全地写入文件,那么可以使用 close ()。