2010-10-12 88 views
1

我的任务是将小部分数据写入频繁并保证文件。这是一种日志记录系统,它必须提供保证数据保存到磁盘的安全性和速度。我发现刹车出现在Flush()函数中太频繁地调用。所以,我决定摆脱它。有什么办法可以加快频繁的文件写操作吗? CFile

我使用了标志,即禁止缓冲和缓存数据(osNoBuffer和writeThrough)。在此之后,据我所知,我可以执行文件I/O操作(将数据写入文件)而不使用flush()? 另一个问题。我如何理解数据肯定是写入磁盘而没有缓存和缓存? 这是赖特的方式来做我想要的,或者可能是加快频繁的文件写入操作的另一种方式?

+2

如果想要在函数返回之前将位写入磁盘,那会导致一些性能下降。你试图达到什么样的信心水平? – 2010-10-12 06:14:36

+0

我写了测试程序,将文本数据写入文件。如果我使用flush,性能大约是50次刷新(每次刷新刷新512字节)/不刷新,直接写入磁盘 - 秒写入5000次。它快100倍。如果我使用这个flasg,我可以计数,我的所有数据都立即写入磁盘而无需调用flush()? – yurart 2010-10-12 07:24:46

回答

3

flush()需要这么长时间,正是因为它确立了您正在寻找的保证。文件通常写入磁盘,该磁盘(可能)正在旋转生锈的磁盘。文件在物理上分散在这些磁盘的表面上,并且需要几毫秒才能将读/写头移到正确的位置。每秒刷新50次意味着每次刷新的平均时间为20毫秒,这与您的磁盘机械上可以做到的接近。

如果不进行刷新,您的写入操作会被合并,因此多次写入操作只需要读/写头的一次移动。即使没有检查具体的标志,也必然意味着数据暂时处于危险之中。

单凭软件,你可以从来没有知道数据是否真正写入磁盘。我们知道这是因为在开发ZFS文件系统时由Sun进行的研究。事实证明,更便宜,速度更慢的磁盘可能会导致冲洗,并在数据实际被刷新之前返回。您将需要服务器级磁盘来保证这一点。

固态硬盘在这方面的表现相当不错。他们不需要物理移动写头。因此,他们对冲动的谎言的动机不大。

相关问题