Domanda

Sto usando NSKeyedArchiver in Mac OS X programma che genera i dati per l'applicazione iPhone. Ho scoperto che per impostazione predefinita, gli archivi risultanti sono molto più grande di quanto mi aspettassi. Esempio:

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"];

Questa negozi 10 * 100000 = 1M byte di dati utili, tuttavia la dimensione del file risultante è quasi tre megabyte. L'overhead sembra essere crescente con il numero di elementi nella matrice. In questo caso, per il 1000 elementi, il file era di circa 22k.

"file" i rapporti che si tratta di un "Apple lista proprietà binaria" (non il formato XML).

C'è un modo semplice per evitare che questo enorme in testa? Ho voluto usare il NSKeyedArchiver per la semplicità che offre. Posso scrivere i dati al mio, non generico, formato binario, ma che non è molto elegante. Inoltre, aggregando i dati in grossi pezzi e alimentando questi al NSKeyedArchiver dovrebbe funzionare, ma ancora una volta, che pò batte il punto di utilizzo semplice e facile da usare e pronto archiviazione. Mi manca un po 'di chiamata di metodo o modello di utilizzo che possa ridurre questo sovraccarico?

È stato utile?

Soluzione

Ho presentato un bug per tracciare questa.

A parte questo, NSKeyedArchiver è stato progettato per l'archiviazione di reti di oggetti. Come, se un oggetto compare due volte nel grafico, il unarchiving potete ancora trovare questo è il caso. Probabilmente stai vedendo in testa per questo tipo di uniquing.

Per i dati strutturati gerarchici in contrapposizione alle reti di oggetti arbitrari, provare NSPropertyListSerialization. Vedo 1.8MB per un plist binario.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top