在Mac OS X下将顺序数据写入磁盘的最快方法是什么?

时间:2011-06-16 17:48:05

标签: objective-c c cocoa macos io

我需要一种以高速率(~200-300Mbit / s)存储大数据块(~1~2MB)的方法。
经过一些研究,我找到了几个选择:

  • aio_write
  • DIRECT_IO
  • Carbon文件管理器的PBWriteForkAsync()
  • 默认fwrite(),包含在一个块中并通过GCD发送
  • NSSO在NSOperation中的appendData
  • ...

wiki page描述了Linux下aio_write的状态。我没有找到的是关于Mac OS X aio_write状态的类似页面。

NSOperation或Blocks + GCD似乎是一种实现非阻塞IO的技术。它用于几个开源IO库(例如https://github.com/mikeash/MAAsyncIO

有类似问题的人是否找到了合适的解决方案? 目前我倾向于PBWriteForkAsync,因为它需要一些“调整”参数。它也应该是64位安全的。

2 个答案:

答案 0 :(得分:2)

我不太了解MacOS,但我也会使用非阻止选项open尝试来自write的{​​{1}}和unistd.h个系统调用。 reference

答案 1 :(得分:1)

您应该使用无缓冲I / O进行写入,在Carbon中FSWriteFork()使用kFSNoCacheBit,在BSD中使用fcntl()使用F_NOCACHE

您可能希望考虑工作线程使用队列顺序写入块,而不是使用系统的非阻塞IO。这将为您提供更多控制,并可能最终变得更简单,特别是如果您想要监视队列以查看是否跟上。

有关详细信息,请参阅here