NSKeyedArchiver на NSArray имеет большие накладные расходы

Я использую программу NSKeyedArchiver в Mac OS X, которая генерирует данные для приложения iPhone. Я обнаружил, что по умолчанию полученные архивы намного больше, чем я ожидал. Пример:

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 = 1 Мбайт полезных данных, а размер результирующего файла составляет почти три мегабайта. Кажется, что накладные расходы растут с увеличением количества элементов в массиве. В данном случае для 1000 элементов файл был около 22к.

«файл» сообщает, что это «список двоичных свойств Apple» (не формат XML).

Есть ли простой способ предотвратить эти огромные накладные расходы? Я хотел использовать NSKeyedArchiver из-за простоты, которую он обеспечивает. Я могу записывать данные в свой собственный, не универсальный, двоичный формат, но это не очень элегантно. Кроме того, агрегирование данных в большие фрагменты и передача их в NSKeyedArchiver должны работать, но опять же, это не имеет смысла в использовании простого, легкого и готового к использованию архиватора. Я пропустил какой-то вызов метода или шаблон использования, который уменьшил бы эти накладные расходы?


person BobK    schedule 06.05.2010    source источник


Ответы (1)


Я зарегистрировал ошибку, чтобы отследить это.

Кроме того, NSKeyedArchiver предназначен для архивирования объектных сетей. Например, если объект появляется на графике дважды, при разархивировании вы все равно обнаружите, что это так. Вы, вероятно, видите накладные расходы для такого рода уникальности.

Для иерархически структурированных данных, а не для произвольных объектных сетей, попробуйте NSPropertyListSerialization. Я вижу 1,8 МБ для двоичного списка.

person Ken    schedule 06.05.2010
comment
Спасибо 8) Вы правы, plist должен помочь. Я забыл, что он тоже имеет двоичный формат. - person BobK; 07.05.2010