c – 优化对磁盘的大量写入

我有一个C应用程序(VStudio 2010,win7 64位)在具有双xeon芯片的机器上运行,这意味着12个物理核心和24个逻辑核心,以及192 gig的ram.
编辑:操作系统是win7(即 Windows 7,64位).

该应用程序有24个线程(每个线程都有自己的逻辑核心)进行计算并填充大规模C结构的不同部分.当所有线程都完成(并且线程完全平衡以便它们同时完成)时,结构大约为60千兆字节.

(我可以控制硬件设置,因此我将使用运行RAID 0的6个2tb驱动器,这意味着写入的物理限制大约是平均顺序写入速度的6倍,或大约2千兆位/秒.)

将此问题转移到磁盘的最有效方法是什么?显然,i / o时间会使计算时间相形见绌.从我对这个主题的研究来看,似乎是write()(而不是fwrite())是要走的路.但是,在设置缓冲区大小等方面,我可以在软件方面进行哪些其他优化?mmap会更有效吗?

解决方法

很难根据你的情况来判断最好的事情.

要做的第一个优化是预分配文件.这样,您的文件系统不需要继续扩展其大小.这应该优化一些磁盘操作.但是,请避免将实际零写入磁盘.只需设定长度即可.

然后你可以在mmap和write之间做出选择.这还取决于您使用的操作系统.在Unix上我会尝试mmap和pwrite. pwrite很有用,因为你的每个线程都可以在所需的文件位置写入文件,而不会争夺文件偏移量.

mmap可能很好,因为您的线程不是将副本复制到文件缓存中,而是直接写入文件缓存. 60 GB可能太大而无法对整个文件进行mmap,因此每个线程可能需要将自己的mmap窗口放在可以移动的文件上.

在Windows中,您可能希望尝试使用重叠的异步IO.这只能通过Win32 API调用来完成.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...