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

标签 file winapi fragmentation defragmentation

我的问题类似于 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/

相关文章:

java - bufferedwriter 拒绝写入文本文件(Java)

javascript - FileReader readAsText 将文件内容作为字符串存储在结果属性中,但是当 console.log 这个结果时,没有返回任何内容。

c++ - 如何删除注册表中损坏的符号链接(symbolic link)

c - Windows 相当于 sync()

.net - 在 C# 中进行大量、快速和频繁的内存分配期间避免 OutOfMemoryException

.net - 如何防止 HttpWebRequest 的数据包碎片

无法打开txt文件

c - 从文件中读取(c 编程)

c++ - FindResource Api 为 DLL 中的文本文件提供错误 1813

filesystems - 什么是 Google 文件系统中的惰性空间分配