1

iPhoneアプリケーション用のデータを生成するMac OS XプログラムでNSKeyedArchiverを使用しています。デフォルトでは、結果のアーカイブが予想よりもはるかに大きいことがわかりました。例:

NSMutableArray * ar = [NSMutableArray arrayWithCapacity:10];

for (int i = 0; i < 100000; i++) {
    NSString * s = [NSString stringWithFormat:@"item%06d", i];
    [ar addObject:s];
}
[NSKeyedArchiver archiveRootObject:ar toFile: @"NSKeyedArchiver.test"];

これは 10 * 100000 = 1M バイトの有用なデータを格納しますが、結果のファイルのサイズはほぼ 3 メガバイトになります。オーバーヘッドは、配列内のアイテムの数とともに増加しているようです。この場合、1000 アイテムの場合、ファイルは約 22k でした。

"file" は、それが "Apple バイナリ プロパティ リスト" (XML 形式ではない) であることを報告します。

この巨大なオーバーヘッドを防ぐ簡単な方法はありますか? NSKeyedArchiver が提供する単純さのために、それを使用したかったのです。データを独自の非汎用のバイナリ形式に書き込むことはできますが、それはあまりエレガントではありません。また、データを大きなチャンクに集約し、これらを NSKeyedArchiver にフィードすることは機能するはずですが、繰り返しますが、単純で簡単ですぐに使用できるアーカイバーを使用するという点に勝っています。このオーバーヘッドを削減するメソッド呼び出しまたは使用パターンが欠落していませんか?

4

1 に答える 1

3

これを追跡するためにバグを報告しました。

それはさておき、NSKeyedArchiver はオブジェクト ネットワークのアーカイブ用に設計されています。同様に、オブジェクトがグラフに 2 回表示された場合でも、アーカイブを解除すると、それが当てはまることがわかります。おそらく、この種の一意化のオーバーヘッドが発生しているでしょう。

任意のオブジェクト ネットワークではなく、階層構造のデータについては、NSPropertyListSerialization を試してください。バイナリ plist には 1.8MB が表示されます。

于 2010-05-06T20:14:31.267 に答える