NSARRAYのnskeyedarchiverは、大きいサイズのオーバーヘッドを持っています

StackOverflow https://stackoverflow.com/questions/2778120

質問

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でした。

「ファイル」は、「Appleバイナリプロパティリスト」であると報告しています(XML形式ではありません)。

この巨大なオーバーヘッドを防ぐ簡単な方法はありますか?私は、それが提供するシンプルさのために、nskeyedarchiverを使用したかったのです。私は自分自身の非遺伝子のバイナリ形式にデータを書くことができますが、それはあまりエレガントではありません。また、データを大きなチャンクに集約し、これらをnskeyedarchiverに供給することは機能するはずですが、繰り返しになりますが、それはシンプルで簡単で簡単に使用できるアーキバーを使用するポイントを打ち負かします。このオーバーヘッドを減らすメソッドコールまたは使用パターンがありませんか?

役に立ちましたか?

解決

これを追跡するためにバグを提出しました。

それはさておき、nskeyedarchiverはオブジェクトネットワークをアーカイブするために設計されています。同様に、グラフにオブジェクトが2回表示される場合、想像していない場合、あなたはまだそうであることがわかります。おそらく、この種のユニークのために頭上を見ているでしょう。

任意のオブジェクトネットワークとは対照的に、階層構造データの場合は、nspropertylisterializationを試してください。バイナリプリストには1.8MBが表示されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top