3

我仅限于在特定应用程序中使用 CoreFoundation,并且无权访问NSData.

我需要使用内存映射从文件中访问数据,因为该文件可能非常大。使用NSData,我可以使用该+dataWithContentsOfURL:options:error:方法实现此目的,并传入NSDataReadingMappedAlways选项。

有可能做到这一点CFData吗?我能找到的唯一CFData直接从文件中创建对象的函数是该CFURLCreateDataAndPropertiesFromResource()函数,它没有任何选项来设置内存映射标志。

CFData是否有一种使用内存映射读取从文件中加载对象的低级方法?我必须下降到mmap什么的吗?

4

2 回答 2

5

您可以CFData()从字节缓冲区和计数创建一个。鉴于此,您应该能够处理mmap()有问题的文件,然后将映射的字节缓冲区传递给CFDataCreateWithBytesNoCopy(). 唯一真正的复杂性是您需要使用CFAllocatorRef知道如何munmap()作为bytesDeallocator.

于 2012-09-26T23:40:55.403 回答
3

这更像是一个评论而不是一个答案,但它太长了,无法放入评论中,所以......</p>

一般来说,当你不知道如何从 Cocoa/Foundation 做某事时,通常值得看看 GNUstep 等价物是如何实现的。当然 GNUstep 并没有实现 100% 的 Foundation 最新版本,而且它是直接在 POSIX 而不是 CoreFoundation 之上编写的,所以它并不总是有帮助……但通常是有帮助的。

NSData.m中,没有+dataWithContentsOfURL:options:error:,但有一个+dataWithContentsOfMappedFile:(当然还有-initWithContentsOfMappedFile:)方法,以及NSDataMappedFile它所依赖的类的实现。

最终, theNSDataMappedFile是一个非常简单的 an 包装器mmapNSData方法只是创建 anNSDataMappedFile并调用它-initWithContentsOfMappedFile:。唯一真正的复杂性是回退代码(确保伪造 mmap 并调用[NSData initWithContentsOfFile:])——您明确不想要的代码。

所以,这是一个很好的线索,您希望完全按照 Kevin Ballard 的建议来实现它。

于 2012-09-27T01:07:06.300 回答