2010-05-06 4 views
1

iPhone 응용 프로그램 용 데이터를 생성하는 Mac OS X 프로그램에서 NSKeyedArchiver를 사용하고 있습니다. 나는 기본적으로 결과 아카이브가 내가 예상했던 것보다 훨씬 큽니다 것을 알았습니다. 예 :NSArray의 NSKeyedArchiver에 큰 크기의 오버 헤드가 있습니다.

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에 공급해야합니다. 다시 한번 간단하게 & & archiver를 사용할 준비가되었습니다. 이 오버 헤드를 줄일 수있는 메서드 호출이나 사용 패턴이 누락 되었습니까?

답변

3

나는 이것을 추적하기위한 버그를 제출했다.

그건 그렇고, NSKeyedArchiver는 객체 네트워크를 보관하도록 설계되었습니다. 마찬가지로 개체가 그래프에 두 번 나타나면 보관을 취소해도됩니다. 이런 종류의 고유화에 대한 오버 헤드가있을 것입니다.

임의 개체 네트워크가 아니라 계층 구조화 된 데이터의 경우 NSPropertyListSerialization을 시도하십시오. 나는 바이너리 plist를 위해 1.8MB를 본다.

+0

감사합니다. 8) 맞습니다. plist가 트릭을해야합니다. 나는 바이너리 형식도 잊어 버렸다. – BobK