4

我的问题类似于如何避免硬盘碎片?,但我每天将生成数百个文件,大小从 2 MB 到 100+ MB 不等(提问者暗示他的文件较小,因为他更担心磁盘混乱,我的问题是读取这些文件的性能)。这些文件一次写入一点点(记录数据),这是创建碎片的最佳方式。(数据库不是一个选项。)我有代码在它们完全编写后进行碎片整理,但是在同一天读回文件时性能会受到影响。

似乎如何在使用 .NET 时限制文件碎片?; 尽管他们缺乏细节(而且我在 C++ 中)。我会使用 SetFilePointerEx() 和 SetEndOfFile() 将文件大小设置为 2MB,然后当文件达到分配的大小时,我将根据观察到的增长率调整大小。然后在写入完成后,调整为实际数据大小。

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

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

4

1 回答 1

2

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

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

于 2012-05-08T11:12:51.140 回答