Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在Mac OS X下,将顺序数据写入磁盘的最快方式是什么?_Objective C_C_Cocoa_Macos_Io - Fatal编程技术网

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

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

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

  • aio\u write
  • 直接输入法
  • 碳文件管理器的
    pbwriteforksync()
  • 默认值
    fwrite()
    ,包装在块中并通过GCD发送
  • NSData的
    appendData
    在NSData操作中
这描述了Linux下
aio\u write
的状态。我没有找到一个关于MacOSX的
aio_write
状态的类似页面

NSOperation或Blocks+GCD似乎是实现非阻塞IO的一种技术。它在几个开源IO库中使用(例如)

有类似问题的人找到合适的解决方案了吗?

目前我倾向于
pbwriteforksync
,因为它需要一些“调优”参数。它也应该是64位安全的。

我对MacOS不是很了解,但我也会尝试使用非阻塞选项
O_NONBLOCK
unistd.h
编写
syscalls

您应该使用无缓冲I/O进行写操作,在碳纤维中这是
FSWriteFork()
with
kFSNoCacheBit
,在BSD中使用
fcntl()
with
F_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后台线程(受信号量保护)上重新映射该文件。