我们反复写一个大型档案文件(很多次1000多次),修补它的各个部分。每次写入后,我们都调用FileFlushBuffer(),但发现这非常非常慢。如果我们等待并且偶尔只调用它(比如说每32个文件),事情就会好转,但我认为这不是正确的做法。
在我们完成上一个补丁之前,有没有办法不刷新缓冲区?如果我们完全取消调用,close()会处理刷新,但它本身就成了一个巨大的瓶颈。如果不这样做,让它在运行时没有锁定我们的其他线程会使它不那么烦人,因为我们不会在写入之外对该文件执行任何IO读取IO。它只是感觉磁盘系统真的在这里阻碍。
更多信息: 目标文件目前是16Gigs,但总是在变化(通常是向上)。我们在文件中的所有地方随机ping了更新,它足够大,我们无法缓存整个文件。在碎片方面,谁知道。这是一个庞大的资产数据库,经常更新,很可能。不确定如何使它不碎片。再次,对任何建议持开放态度。
答案 0 :(得分:3)
如果您在开始时知道文件的最大大小,那么这看起来像是经典的内存映射文件应用程序
修改。 (至少在Windows上)在映射文件时,无法更改内存映射文件的大小。但是,您可以在打开文件和打开映射之间快速扩展它,只需SetFilePointer()到一些大值和setEndOfFile()。在关闭映射之后和关闭文件之前,您可以类似地缩小它。
你可以将< 4Gb视图(或多个视图)映射到一个更大的文件中,文件系统缓存往往对内存映射文件有效,因为它与操作系统用于加载程序的机制相同,因此调整得很好。您可以在更新发生时管理操作系统,也可以强制刷新某些内存范围。