我在File Objects 的 Python 文档中找到了这一点:
flush()
不一定将文件的数据写入磁盘。使用flush()
后跟os.fsync()
确保此行为。
所以我的问题是:Python 到底在flush
做什么?我以为它会强制将数据写入磁盘,但现在我发现它没有。为什么?
我在File Objects 的 Python 文档中找到了这一点:
flush()
不一定将文件的数据写入磁盘。使用flush()
后跟os.fsync()
确保此行为。
所以我的问题是:Python 到底在flush
做什么?我以为它会强制将数据写入磁盘,但现在我发现它没有。为什么?
通常涉及两个级别的缓冲:
内部缓冲区是由您正在编程的运行时/库/语言创建的缓冲区,旨在通过避免每次写入的系统调用来加快速度。相反,当您写入文件对象时,您写入其缓冲区,并且每当缓冲区填满时,使用系统调用将数据写入实际文件。
但是,由于操作系统缓冲区的原因,这可能并不意味着数据已写入磁盘。这可能只是意味着数据从运行时维护的缓冲区复制到操作系统维护的缓冲区中。
如果您写了一些东西,并且它最终进入缓冲区(仅),并且您的机器断电,那么当机器关闭时,该数据不在磁盘上。
因此,为了帮助您在各自的对象上拥有flush
和方法。fsync
第一个 ,flush
将简单地将程序缓冲区中滞留的任何数据写入实际文件。通常这意味着数据将从程序缓冲区复制到操作系统缓冲区。
具体来说,这意味着如果另一个进程打开了相同的文件以供读取,它将能够访问您刚刚刷新到文件中的数据。但是,这并不一定意味着它已“永久”存储在磁盘上。
为此,您需要调用os.fsync
确保所有操作系统缓冲区与它们所使用的存储设备同步的方法,换句话说,该方法会将数据从操作系统缓冲区复制到磁盘。
通常,您不需要为任何一种方法而烦恼,但是如果您处于对实际最终在磁盘上的内容的偏执是一件好事的情况下,您应该按照指示进行这两个调用。
2018 年增补。
请注意,具有缓存机制的磁盘现在比 2013 年更加普遍,因此现在涉及更多级别的缓存和缓冲区。我假设这些缓冲区也将由同步/刷新调用处理,但我真的不知道。
因为操作系统可能不会这样做。刷新操作强制文件数据进入 RAM 中的文件缓存,然后操作系统的工作就是从那里实际将其发送到磁盘。
它刷新内部缓冲区,这应该导致操作系统将缓冲区写入文件。 [1] Python 使用操作系统的默认缓冲,除非您另外配置。
但有时操作系统仍然选择不合作。尤其是像 Windows/NTFS 中的写入延迟这样美妙的事情。基本上内部缓冲区已被刷新,但操作系统缓冲区仍在保留它。os.fsync()
因此,在这些情况下,您必须告诉操作系统将其写入磁盘。
基本上,flush() 会清除您的 RAM 缓冲区,它的真正强大之处在于它可以让您在之后继续写入它 - 但它不应该被认为是最好/最安全的写入文件功能。它正在刷新您的 RAM 以获取更多数据,仅此而已。如果您想确保数据被安全地写入文件,请改用 close() 。