NSArray上的NSKeyedArchiver具有很大的开销

时间:2010-05-06 02:52:00

标签: iphone macos overhead nskeyedarchiver

我在Mac OS X程序中使用NSKeyedArchiver,它为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字节的有用数据,但生成的文件大小几乎为3兆字节。随着数组中项目的数量增加,开销似乎在增长。在这种情况下,对于1000个项目,文件大约是22k。

“file”报告它是“Apple二进制属性列表”(不是XML格式)。

有没有一种简单的方法可以防止这种巨大的开销?我想使用NSKeyedArchiver来提供简单性。我可以将数据写入我自己的非通用二进制格式,但这不是很优雅。此外,将数据聚合成大块并将这些数据提供给NSKeyedArchiver应该可以正常工作,但同样,这有点超过了使用简单易用且随时可用的存档器的重点。我是否缺少一些可以减少这种开销的方法调用或使用模式?

1 个答案:

答案 0 :(得分:3)

我提交了一个错误来跟踪此事。

除此之外,NSKeyedArchiver是为归档对象网络而设计的。就像,如果一个对象在图形中出现两次,在取消归档时你仍然会发现情况就是这样。你可能会看到这种无所事事的开销。

对于与任意对象网络相对的分层结构化数据,请尝试NSPropertyListSerialization。我看到一个二进制plist 1.8MB。