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 にフィードすることは機能するはずですが、繰り返しますが、単純で簡単ですぐに使用できるアーカイバーを使用するという点に勝っています。このオーバーヘッドを削減するメソッド呼び出しまたは使用パターンが欠落していませんか?