我使用VB6和Win32 API将数据写入文件,此功能用于导出数据,因此写入磁盘性能是我考虑的关键因素。因此,当通过调用 CreateFile 打开文件时,我使用 FILE_FLAG_NO_BUFFERING FILE_FLAG_WRITE_THROUGH 选项。

FILE_FLAG_NO_BUFFERING 要求我使用自己的缓冲区并以磁盘扇区大小的倍数将数据写入文件,除了最后一部分数据外,这一般都没问题,如果是不是扇区大小的确切倍数将包括字符零填充文件,如何在写入最后一个块时将文件大小设置为不包括这些字符零?

我可以使用 SetEndOfFile 但是这需要我关闭文件并重新打开它而不使用 FILE_FLAG_NO_BUFFERING 。我见过有人谈论 NtSetInformationFile 但是我找不到如何在VB6中使用和声明它。 SetFileInformationByHandle 可以完全按照我的要求行事,但它只在Windows Vista中可用,我的应用程序需要与以前版本的Windows兼容。

有帮助吗?

解决方案

我不确定,但您确定设置FILE_FLAG_NO_BUFFERING和FILE_FLAG_WRITE_THROUGH可以获得最佳性能吗?

它们肯定会导致您的数据尽快进入磁盘,但这种情况实际上并没有帮助提高性能 - 它只是帮助您希望尽可能完整的日志文件之类的可靠性。发生事故。

对于您所描述的数据导出例程,允许操作系统缓冲数据可能会导致更好的性能,因为写入将按照其他磁盘活动进行调度,而不是强制磁盘跳回到您的每次写文件。

为什么不在没有这些选项的情况下对代码进行基准测试?保留0字节填充逻辑,使其成为公平的测试。

如果事实证明跳过这些选项的速度更快,那么您可以删除0填充逻辑,并且您的文件大小问题会自行解决。

其他提示

我相信SetEndOfFile是唯一的方法。

我同意Mike G.你应该在有和没有FILE_FLAG_NO_BUFFERING的情况下对你的代码进行测试。现代操作系统上的Windows文件缓冲非常有效。

我很惊讶!使用Windows缓冲而不是自己完成所有操作 MUCH 更快。我一直在写一个1Gb文件进行测试,使用我自己的缓冲区, FILE_FLAG_NO_BUFFERING FILE_FLAG_WRITE_THROUGH 选项平均花费21.146秒,没有那些设置并使用Windows缓冲区平均时间下降到13.53秒,快了30%!

自我注意:无需重新发明轮子。 ; - )

谢谢你 Mike G '的快速准确答案。还要感谢你' gabr ',现在根本不需要理解 SetEndOfFile

对于1 GB的文件,Windows缓存确实可能更快,尤其是。如果做很多小IO。如果您处理的文件比可用RAM大得多,并且执行大块IO,那么您设置的标志将产生必须更好的吞吐量(对于大量线程和/或随机大块IO,速度提高3倍)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top