我为我的同事写了一个下载库。它将下载的数据写入文件。
我的同事发现,即使下载了 100 Mb 的数据,该文件也会长时间保持较小的状态。
所以他们建议我应该flush()
在每个之后调用,write()
这样它就不会占用内存来缓冲这些数据。
但我认为 100 Mb 的虚拟内存并不多,并且认为 Windows 可能有理由缓冲这么多数据。
你怎么看待这件事?
我为我的同事写了一个下载库。它将下载的数据写入文件。
我的同事发现,即使下载了 100 Mb 的数据,该文件也会长时间保持较小的状态。
所以他们建议我应该flush()
在每个之后调用,write()
这样它就不会占用内存来缓冲这些数据。
但我认为 100 Mb 的虚拟内存并不多,并且认为 Windows 可能有理由缓冲这么多数据。
你怎么看待这件事?
好吧,首先你应该调查/调试正在发生的事情。问题可能出在其他地方;例如,Windows 资源管理器可能无法足够快地刷新文件大小。
也就是说,你是对的,通常如果操作系统的 VM 系统决定在 RAM 中缓冲内容,它有充分的理由这样做,你通常不应该干预。毕竟,如果有很多可用内存,那么使用它是有意义的。
我个人相信操作系统会适当地调整自己。
至于“如果断电立即刷新以免丢失数据” - 如果电源在文件中途断电,您是否相信您写入的数据没问题并从那里恢复下载?如果是这样,也许值得早点刷新 - 但我会权衡恢复的复杂性与电源故障的相对罕见性,并在我阅读完所有内容后关闭文件。如果您看到半写的文件,请将其删除并从头开始重新下载。
如果是我,我想确保所有数据尽快保存到非易失性位置。我肯定会冲洗流,以确保在发生电源故障时不会丢失任何东西。您没有指定以后是否需要访问数据,但我认为有,否则为什么要存储它?不过,要回答最初的问题 - 它对操作系统没有“害处”,但您确实有丢失数据的风险。
以某些特定的间隔/大小/行刷新可能会更好,而不是每次写入都刷新。它有助于减少内存占用,并确保实际文件定期更新信息。例如,您可以每 100 行刷新一次。
如果有一种方法可以减少内存需求而对性能的影响可以忽略不计,那么我更喜欢不那么贪婪的版本。我可能需要那个内存来做更重要的事情,而 100Mb 的占用空间对于下载器来说是相当大的。