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