我的问题类似于 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 边界?
关于file - 如何在写入数百个多兆字节文件时避免文件碎片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10456698/