【发布时间】: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