FileFlushBuffer() is so slow



我们对单个大型归档文件进行重复写入(多次),并对其各个部分进行修补。每次写入后,我们都会调用FileFlushBuffer(),但发现这非常非常慢。如果我们等待,只是偶尔调用它(比如每32个文件调用一次),情况会更好,但我认为这不是正确的方法。

在我们完成最后一个补丁之前,有没有办法不刷新缓冲区?如果我们完全取消调用,close()确实会处理flush,但它本身就成为了一个巨大的瓶颈。如果不能做到这一点,让它在运行时不锁定我们的其他线程会让它不那么烦人,因为我们不会在写入之外对该文件进行任何IO读取IO。感觉磁盘系统真的在妨碍我们。

更多信息:目标文件当前为16Gigs,但总是在变化(通常是向上)。我们在文件中的所有地方随机ping更新,它足够大,我们无法缓存整个文件。就碎片化而言,谁知道呢。这是一个经常更新的大型资产数据库,所以很可能。不确定如何使其不碎裂。再次,欢迎任何建议。

如果您在一开始就知道文件的最大大小,那么这看起来就像一个经典的内存映射文件应用程序

编辑。(至少在windows上)在映射内存映射文件时,不能更改该文件的大小。但是,您可以在打开文件和打开映射之间快速扩展它,只需将FilePointer()设置为某个大值,然后设置EndOfFile()。您可以在关闭映射后和关闭文件前对其进行类似的收缩。

您可以映射<4Gb视图(或多个视图)到一个大得多的文件中,文件系统缓存往往对内存映射文件更有效,因为它与操作系统用于加载程序的机制相同,因此经过了很好的调整。您可以让操作系统管理何时发生更新,也可以强制刷新某些内存范围。

最新更新