2010-05-06 2 views
1

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

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

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

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

ответ

3

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

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

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

+0

Спасибо 8) Вы правы, plist должен сделать трюк. Я забыл, что у него также есть двоичный формат. – BobK