磁盘IO问题与循环文件写入

时间:2015-07-22 09:16:56

标签: c++ windows boost windows-7-x64 memory-mapped-files

在我的软件中,我有4x 500GB文件,我使用boost内存映射文件API以循环方式写入顺序

我在32MB块中分配区域,并且在最后分配块时,我创建了两个内存映射区域,其中第一个是文件的末尾,第二个是文件的开头,并映射到结束的地址。第一个地区。

现在这适用于较小的文件。但是,对于到达终端区域的大文件,磁盘性能会下降,我不知道如何避免它。

我猜测正在发生的事情是磁盘试图写入文件的两端并且主轴必须来回跳转。这是一件相当愚蠢的事情,特别是在进行顺序写操作时,我希望操作系统会更聪明一些。

有没有人对如何避免这个问题有任何想法?

我正在考虑升级到Windows 10并希望它能做得更好。但是,我现在想避免这是一个相当危险的变化。

我还应该注意,这些文件位于带有2x 3TB Seagate Constallation Enterprise驱动器的软件RAID 1上。这些驱动器的最小顺序写入速度为60MB / s,平均速度为120MB / s,我总是以30 MB / s的速度写入所有文件。

可以找到代码here

编辑:

事实证明,在写入整个文件然后从头开始重新启动之后,操作系统实际上开始读回磁盘上的内容,即使不需要我认为导致问题的内容。

1 个答案:

答案 0 :(得分:1)

"这些驱动器的最小顺序写入速度为60MB / s" - 这是无关紧要的,因为你没有进行顺序写入。

使用SSD缓存,或重新考虑设计(找到一种方法来防止跨缓冲区环绕访问)。

与spee无关:您可以使用直接映射到文件的循环缓冲区,因此您不必使用(专有?)技巧来映射"连续"地址区域。粗略的想法:boost::circular_buffer equivalent for files?