如何通过稀疏文件优化SetEndOfFile操作,避免磁盘空间浪费?

摘要:本文尝试说明 SetEndOfFile 占用磁盘空间时存在的尾部数据写入卡顿的性能问题,并讲解了两种解决方案,分别是 SetFileValidData 和稀疏文件,以及它们的局限性
前言 之前写过一篇文章说明文件空洞:《[apue] 文件中的空洞》,其中提到了 windows 稀疏文件是制造空洞的一种方式,但似乎没什么用处,如果仅仅处理占用磁盘空间的场景,使用SetEndOfFile 就足够了。 后来在实际工作中,发现稀疏文件在解决一个性能问题方面,有着不可替代的作用,下面且听我一一道来。 问题现象 公司的文件下载产品,为了预防在下载过程中因磁盘空间不足而失败,在 windows 上采取预分配的策略,在下载任务开始前就占据了相当于文件长度的磁盘空间。由于数据源也包括从 P2P 处获取的数据,导致写入时并不是顺序的,存乱序写入的情况,这些信息都存储在数据库中,当应用重启时,会从数据库加载块信息,继续对未落盘的块进行网络请求。 整个逻辑看起来没有问题,然而实测在距离当前写入位置较远的地方写入块时,会发现落盘速度极慢。
阅读全文