NSARRAYのnskeyedarchiverは、大きいサイズのオーバーヘッドを持っています
-
03-10-2019 - |
質問
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が表示されます。