NSKeyedArchiver на NSArray имеет большие размеры - PullRequest
1 голос
/ 06 мая 2010

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

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

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

1 Ответ

3 голосов
/ 07 мая 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...