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