NSUserDefaults に約 50MB の NSData オブジェクトを保存することが悪い考えである理由はありますか?
ドキュメントには何もありませんが、NSUserDefaults が使用されているのを見ると、通常はかなり少量のデータです。ファイルに保存するよりもNSUserDefaultsに保存するほうが簡単だと思うので、できれば利用したいです。
NSUserDefaults に約 50MB の NSData オブジェクトを保存することが悪い考えである理由はありますか?
ドキュメントには何もありませんが、NSUserDefaults が使用されているのを見ると、通常はかなり少量のデータです。ファイルに保存するよりもNSUserDefaultsに保存するほうが簡単だと思うので、できれば利用したいです。
アプリのNSUserDefaults
ドメインは、XML プロパティ リストとしてディスクに書き込まれます。XML plist に NSData が含まれている場合、データは 16 進数のテキストで表されます (読みやすいように空白を追加)。データの各バイトは 2 文字のテキストになるため、50 MB のデータは 100 MB になります。
さらに、プロパティ リストはランダム アクセス ファイルではありません。ユーザー (またはこの場合は Apple の の実装NSUserDefaults
) がディスク上のプロパティ リストの値を読み取りたい場合、ファイル全体が読み取られ、解析されてNSDictionary
. 変更を加えてディスクに保存したい場合は、ディクショナリ全体がシリアル化され、ファイルに書き出されます。したがって、読み取りと解析、またはシリアル化と書き込みは、1 kB ファイルよりも 100 MB ファイルの方がはるかに時間がかかります。これは、アプリのライフサイクル全体で何度も発生する可能性があるため、ユーザー(または Apple のフレームワークの一部のコード。NSUserDefaults
内部的に使用される場合があるため) を呼び出すたびに発生します。-[NSUserDefaults synchronize]
すでに NSData を持っている場合、それを自分でファイルに入れるのは難しくありません。-[NSData initWithContentsOfFile:]
それ-[NSData writeToFile:atomically:]
が目的です。(さらに、アプリの docs ディレクトリで読み取り/書き込み用のパスを取得するのに 1、2 行しかかかりません。いくつかの例については、Xcode プロジェクト テンプレートを参照してください。)
NSUserDefaults はオブジェクトをプロパティ リストとして格納するため、バイナリ形式ではなくテキスト (XML) 形式の plist を使用する可能性があります。この場合、NSData は ints 記述をファイルに送信しますが、これは実際のサイズの 2 倍の大きさです。実際には、データの 16 進数表現 (およびスペース パディングなど) であるためです。
その場合、概念的に誤用/乱用されます。ユーザーのデフォルトは、まあ、ユーザーのデフォルトです。つまり、ファイル全体ではなく、設定/設定を保存するために使用する必要があります。これは、ファイル処理 API (C stdio 関数、NSFileHandle など) のタスクです。
お役に立てれば。
50 MB のバイナリ データをプロパティ リストとの間で変換するのは非常に効率が悪いからです。そのような場合、直接ファイル IO が唯一の適切な選択です。
また、ユーザーのデフォルトにアクセスする他のアプリケーションは、100 MB の読み取りと解析に時間を費やさなければなりません。