如何在编写数百个多兆字节文件时避免文件碎片?

我的问题类似于
How to avoid hard disc fragmentation?,但我每天会生成几百个文件,大小范围从2 MB到100 MB(提问者暗示他的文件较小,因为他更担心磁盘混乱,我的问题是性能阅读这些文件).这些文件一次写入一点(记录数据),这是创建碎片的最佳方法. (数据库不是一个选项.)我有完整编写完成后进行碎片整理的代码,但性能会受到同一天读取文件的影响.

看来这样做的方法是在How can I limit file fragmentation while working with .NET?之前提出的;他们缺乏细节(我在C).我将使用SetFilePointerEx()和SetEndOfFile()将文件大小调整为2MB,然后当文件达到分配大小时,我将根据观察到的增长率调整大小.然后在写入完成时,调整大小到实际数据大小.

我看到的一个陷阱(实际上http://www.cplusplus.com/forum/windows/22114/指出了)如果我的应用程序崩溃或计算机关闭会发生什么.现在我的文件中有未确定的数据,无法通过Windows检测到它.这表明我创建了一个文件来跟踪每个文件或单个文件写入了多少数据.有更好的策略吗?也许在每次写入后写入足够的零以便以后能够检测到(然后备份以备下一次写入)?

你看到我错过了其他任何陷阱吗?

最佳答案 我们使用预分配方法以500MB的块为单位增加文件大小.由于它是视频数据,我们还存储一个单独的索引文件,我们可以读取并验证以查找最后一个(相信的有效)数据的时间.

如果你的数据是文本的,这可能会有点痛苦,但你可以写到最后忽略空数据,可能会跳到2MB边界?

点赞