Objective c 在Mac OS X下,将顺序数据写入磁盘的最快方式是什么?
我需要一种以高速率(~200-300Mbit/s)存储大数据块(~1-2MB)的方法。Objective c 在Mac OS X下,将顺序数据写入磁盘的最快方式是什么?,objective-c,c,cocoa,macos,io,Objective C,C,Cocoa,Macos,Io,我需要一种以高速率(~200-300Mbit/s)存储大数据块(~1-2MB)的方法。 经过一些研究,我发现了几个选择: aio\u write 直接输入法 碳文件管理器的pbwriteforksync() 默认值fwrite(),包装在块中并通过GCD发送 NSData的appendData在NSData操作中 这描述了Linux下aio\u write的状态。我没有找到一个关于MacOSX的aio_write状态的类似页面 NSOperation或Blocks+GCD似乎是实现非阻塞I
经过一些研究,我发现了几个选择:
aio\u write
- 直接输入法
- 碳文件管理器的
pbwriteforksync()
- 默认值
,包装在块中并通过GCD发送fwrite()
- NSData的
在NSData操作中appendData
aio\u write
的状态。我没有找到一个关于MacOSX的aio_write
状态的类似页面
NSOperation或Blocks+GCD似乎是实现非阻塞IO的一种技术。它在几个开源IO库中使用(例如)
有类似问题的人找到合适的解决方案了吗?目前我倾向于
pbwriteforksync
,因为它需要一些“调优”参数。它也应该是64位安全的。我对MacOS不是很了解,但我也会尝试使用非阻塞选项O_NONBLOCK
从unistd.h
编写syscalls 您应该使用无缓冲I/O进行写操作,在碳纤维中这是FSWriteFork()
withkFSNoCacheBit
,在BSD中使用fcntl()
withF_NOCACHE
<>而不是使用系统的非阻塞IO,您可能需要考虑一个工作者线程来使用队列顺序地写入块。这将为您提供更多的控制,并可能最终变得更简单,特别是如果您希望监视队列以查看是否跟上
有关更多信息,请参阅。无法判断基准是否不足。您也可以考虑MAMP()。我目前正在搜索所有可用的选项。在osx下,aio_write不是一个很好的选项,因为除了通过信号之外,没有其他方式获得通知。即使这样,您也无法获得相关的用户数据,因为osx不支持这些数据。我建议从名单上删除所有你写的东西。谢谢-很高兴知道!这可能节省了我几个小时:)我已经花了好几天的时间做这件事了。。它在linux上工作得很好,因为您可以附加用户数据(指向aio结构的指针,该结构恰好完成了写入),并将其作为附加到信号的数据。它在freebsd中工作得更好,因为您可以将aio与kevent/kqueue一起使用,这无疑会提高您的速度和控制能力。然而,在osx下,aio的唯一选项是接收信号并在所有句柄上进行循环,以查看哪个句柄实际完成了它的工作:-/太糟糕了。谢谢。我不知道你是谁。我知道O_DIRECT(在OSX下不可用)。目前,我使用一种自定义方法,使用mmap&Grand Central Dispatch,到目前为止效果不错。通过使用GCD,我的IO也是非阻塞的,mmap迫使我快速完成页面对齐的写入。谢谢。正如您链接的Apple文档中提到的,我已经尝试过PBWriteForkAsync。令人惊讶的是,这比FSWriteFork慢。最终我使用了2个连续的mmap ped区域。我向一个地区写信,直到它满为止。然后,我切换、展开并在GCD后台线程(受信号量保护)上重新映射该文件。