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は最新バージョンのFoundationを100%実装しているわけではなく、CoreFoundationではなくPOSIXの上に直接記述されているため、常に役立つとは限りませんが、多くの場合は役立ちます。

NSData.mにはありません+dataWithContentsOfURL:options:error:+dataWithContentsOfMappedFile:(そしてもちろん-initWithContentsOfMappedFile:)メソッドと、NSDataMappedFileそれが依存するクラスの実装があります。

最終的に、NSDataMappedFileは、の非常に単純なラッパーmmapであり、NSDataメソッドはを作成してNSDataMappedFileそのを呼び出すだけ-initWithContentsOfMappedFile:です。唯一の本当の複雑さは、フォールバックコード(mmapを偽造して呼び出すだけ[NSData initWithContentsOfFile:]です)、つまり明示的に不要なコードです。

だから、それはあなたがこれをケビン・バラードが提案した方法で正確に実装したいという良い手がかりです。

于 2012-09-27T01:07:06.300 に答える