【问题标题】:What is the fastest way to write sequential data to disk under Mac OS X?在 Mac OS X 下将顺序数据写入磁盘的最快方法是什么?
【发布时间】:2011-06-16 17:48:05
【问题描述】:

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

  • aio_write
  • Direct_IO
  • 碳文件管理器PBWriteForkAsync()
  • 默认fwrite(),包装在一个块中并通过GCD调度
  • NSOperation 中的 NSData 的 appendData
  • ...

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

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

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

【问题讨论】:

  • 无法判断是否缺少基准。你也可以考虑 mmap()。
  • 我一定会测量的。我目前正在寻找所有可用的选项。
  • 在 osx aio_write 下不是一个很好的选择,因为除了通过信号之外没有其他方法可以得到通知。即使那样,您也不会获得相关的用户数据,因为 osx 不支持。我建议从列表中删除 aio_write。
  • 谢谢 - 很高兴知道!这可能为我节省了几个小时:)
  • 我已经花了几天的时间来做这件事。它在 linux 上工作得很好,因为你可以附加用户数据(指向恰好完成写入的 aio 结构的指针)并将其作为附加到信号。它在 freebsd 中工作得更好,因为您可以将 aio 与 kevent/kqueue 一起使用,这肯定会给您带来更快的速度和控制。然而,在 osx 下,aio 的唯一选择是接收信号并对所有句柄进行循环,试图查看哪个句柄实际完成了它的工作:-/ 这很糟糕。

标签: objective-c c cocoa macos io


【解决方案1】:

我不太了解 MacOS,但我也会尝试使用非阻塞选项 O_NONBLOCK 来自 unistd.hopenwrite 系统调用。 reference

【讨论】:

  • 谢谢。我不知道 O_NONBLOCK。我知道 O_DIRECT (在 OS X 下不可用)。目前我使用一种使用 mmap 和 Grand Central Dispatch 的自定义方法,到目前为止它看起来不错。通过使用 GCD,我的 IO 也是非阻塞的,并且 mmap 迫使我进行快速、页面对齐的写入。
【解决方案2】:

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

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

更多信息请参见here

【讨论】:

  • 谢谢。如您链接的 Apple 文档中所述,我已经尝试过 PBWriteForkAsync。令人惊讶的是,这比 FSWriteFork 慢。最终我最终使用了 2 个连续的 mmap-ped 区域。我写到一个区域,直到它写满为止。然后我在 GCD 后台线程(受信号量保护)上切换、展开和重新映射文​​件。
猜你喜欢
  • 2012-06-01
  • 2010-11-08
  • 1970-01-01
  • 2020-12-29
  • 1970-01-01
  • 2011-06-13
  • 2011-06-15
  • 2014-12-21
  • 1970-01-01
相关资源
最近更新 更多