2014-01-15 1 views
1

코어 데이터에 수백 MB 파일 세트를로드 중입니다. 관계형 조인을 사용하는 대신 NSDictionaries/NSArray를 생성하고 Core Data 레코드에 직렬화함으로써 성능이 훨씬 향상되었음을 발견했습니다. 내가 루프 (파일 당이 약 70K에서 완전히 나는 경우가 정리됩니다코어 데이터에서 ARC를 통해 JSON (NSData로) JSON을 저장할 때

NSMutableDictionary *stackEntryDictionary = [NSMutableDictionary dictionary]; 
NSDictionary *stackDictionary = [NSDictionary dictionaryWithObjectsAndKeys: 
                                [NSString stringWithUTF8String:parts[6].c_str()], @"relationship" 
                                , [NSString stringWithUTF8String:parts[8].c_str()], @"sequenceId" 
                                , [NSString stringWithUTF8String:parts[9].c_str()], @"sequence" 
                                , [NSString stringWithUTF8String:parts[7].c_str()], @"block" 
                                , [NSNumber numberWithInteger:row], @"entryId" 

                                , nil ]; 
if ([relationship isEqualToString:@"consensus"] || [relationship isEqualToString:@"model"]) { 
                            [stackEntryDictionary setObject:stackDictionary forKey:relationship]; 
                            row = 1; 
                        } 
                        else { 
                            [stackEntryDictionary setObject:stackDictionary forKey:[NSNumber numberWithInt:row].stringValue]; 
                            ++row; 

                        } 


stackEntryDatumMO = [NSEntityDescription insertNewObjectForEntityForName:@"StackEntryDatum" inManagedObjectContext:document.managedObjectContext]; 
stackEntryDatumMO.sampleId = sampleMO.sampleId; 
stackEntryDatumMO.name = sampleMO.name; 

stackEntryDatumMO.tagId = [NSNumber numberWithInteger:locusId]; 

// THIS IS THE "BAD LINE" that issues a lot of NSString malloc's  

stackEntryDatumMO.stackData = [NSJSONSerialization dataWithJSONObject:stackEntryDictionary options:0 error:&error]; 

를 들어, 내 메모리 풋 프린트 지붕으로 인해 구약의 malloc의이 라인에 기인 통과 taht를 문제는 지금까지입니다 30 개 파일이며, 삽입 사전의 평균 크기는 약 20입니다. 그러나 응용 프로그램 성능을 저하시키고 불필요한 약 10GB의 메모리를 사용하고 있습니다.

그래서 두 가지 질문이 있습니다. 1 - 어떻게 핵심 데이터에 개체를 포함시킬 것을 제안합니까 (또는 제안 하시겠습니까?). 2 - 더 적은 메모리 풋 프린트를 제공하는 더 우수한 JSON 직렬화 라이브러리가 있습니까? 3 - ARC를 포기해야합니까? 그렇다면 어떻게해야합니까? 4 - 다른 제안 사항이 있으십니까? 별도의 가져 오기 "응용 프로그램"을 사용하는 것이 임시 대체 솔루션이 될 수 있지만, 장기간 App-Store에 게시 된 것을 볼 수는 없습니다.

로드 후 ARC가 정리되면 이미 릴리스 된 객체를 릴리스하려고 시도 할 때 응용 프로그램이 종료됩니다 (필요한 경우 나중에 오류를 게시 할 수 있음). 이것은 작은 파일에는 발생하지 않습니다.

+0

'@ autoreleasepool'을 사용하십시오. –

+0

예, dataWithJSONObject 호출 주위에 자동 회수 풀을 넣으십시오. (stackData가 "강력 함"이라고 가정합니다.) –

답변

1

@autoreleasepool에서 NSJSONSerialization 호출을 래핑 해보면 호출 후 필요하지 않은 대량의 자동 회수 된 객체가 생성됩니다.

NSData로 저장하면 CoreData에서 동일한 메모리 사용 공간이 자신의 파일에 저장 될 수 있습니다. NSManagedObject에 필요한 물건에 대해 객체 당 조금 더 지불 하겠지만 순 비용은 거의 같습니다.

코어 데이터 개체의 할당을 더 자주 강제로 설정하여 풋 프린트를 조정할 수 있습니다. 이렇게하는 가장 갑작스러운 방법은 사용중인 관리되는 개체 컨텍스트를 저장 한 다음 할당을 해제하는 것입니다. 필요한 경우 @autoreleasepool을 적용하십시오.

루프 또는 힙의 스냅 샷에있는 동안 Instruments 할당 계기의 샘플을 게시 할 수도 있습니다.

+0

긴 응답을 드려서 죄송합니다 (빠른 응답에 대해 감사드립니다!). 처리해야했다 [http://stackoverflow.com/questions/17477263/nsopenpanel-runmodal-crashes/21169336#21169336 | 이] 처음. 이것은 모든 코드에 주석을 달지 않고도 메모리를 몇 GB에서 1 ​​GB 미만으로 보냈습니다. 감사! –

+0

걱정하지 않아도 괜찮습니다. – ImHuntingWabbits