2012-06-29 5 views
2

내 회사에서 iPad 앱에서 사용하는 웹 서비스를 만들었으며 집에서 iOS 개발 경험이 없으므로 계약을 맺었습니다.큰 JSON 데이터의 메모리 문제

초기화 프로세스의 일부로 앱은 JSON 형식으로 웹 서비스에서 데이터의 시작 집합을받습니다. 대부분의 앱 사용자는이 데이터 세트의 크기가 약 4MB (압축되지 않음)이므로 문제없이 응용 프로그램에서 처리합니다.

작은 사용자 그룹의 경우 데이터 크기가 훨씬 크기 때문에 압축되지 않은 크기는 약 65MB입니다. 이 데이터 세트를 사용하면 iPad 앱이 충돌하고 개발자가 너무 많은 메모리를 사용 중이므로 앱이 삭제되고 있다고 주장합니다. 필자가 올바르게 이해했다면, JSON을 메모리 내 객체로 구문 분석하는 동안 이런 일이 일어나고 있다고 말하는 것입니다.

1GB 메모리가 장착 된 장치는 65MB의 데이터를 처리하는 데 문제가 없어야하지만,이를 기반으로 한 iOS 환경에 대한 경험이 없습니다.

iOS에서 많은 수의 JSON 데이터를 처리 할 수있는 사람이 있습니까? 문제가 메모리에 전체 JSON 데이터 세트를로드하는 경우 iOS 용 스트리밍 JSON 파서가 메모리를 적게 차지합니까?

+0

RestKit을 보았습니까? 비동기 데이터가 처리됩니다. JSON을 웹 서비스에서 대량으로 처리하는 우리 회사에서 일합니다. 또한 단기적인 해결책은 고정 된 크기의 작은 패킷으로 데이터를 전송하는 것입니다. 다루기 쉽고 작업하기 쉽습니다. –

+2

WWDC 2012에서 Apple은 iPad 3에서 650MB의 하드 메모리 제한을 사용할 수 있다고 말했지만 (워치 독을 초과하면 앱을 종료 할 수 있음) 다른 기기에는 하드 한도가 없습니다. 하지만 어쨌든 JSON 데이터를 10MB 덩어리로 보내고 한 번에 하나씩 처리하도록 할 수는 없습니까? –

+0

최상의 솔루션은 데이터를 청크로 전달하여 문제를 해결하고 처리 속도를 향상시키는 것입니다. – rishi

답변

1

json을 NSDictionaries/NSArrays/NSStrings/NSNumber로 변환하는 것이 문제가 아닌 것 같습니다.

제 생각에 autoreleased 풀을 비우기 전에 모든 이미지의 축소판 만들기와 같이 엄격한 루프에서 autoreleased 오브젝트가있는 json 결과를 사용하는 것 같습니다.

데이터가 데이터에 맞지 않는 경우 데이터 세트에서 수행되는 작업의 유형에 대한 몇 가지 예를 제공 할 수 있습니까?

이것은 모든 이미지를 다운로드하여 축소판 그림을 만들 때까지 자동 복구 풀에 umcompressed uiimages를 계속해서 저장하기 때문에 매우 나쁜 코드입니다.

NSArray* images = [jsonObject objectForKey:@"images"]; 

for(NSString* imageURL in images){ 
    NSURL* url = [NSURL URLWithString: imageURL]; 
    NSData* data = [NSData dataWithContentsOfURL: url]; 
    UIImage* image = [UIImage imageWithData: data]; 
    // write image to disk 
    UIImage* thumbnail = CreateThumbnailFromImage(image); 
    // write thumbnail to disk 
} 

자동 릴리스 된 개체를 더 빨리 정리할 다른 자동 릴리스 풀을 추가하면 동일한 코드를 수정할 수 있습니다.

for(NSString* imageURL in images){ 
    @autoreleasepool { 
    NSURL* url = [NSURL URLWithString: imageURL]; 
    NSData* data = [NSData dataWithContentsOfURL: url]; 
    UIImage* image = [UIImage imageWithData: data]; 
    // write image to disk 
    UIImage* thumbnail = CreateThumbnailFromImage(image); 
    // write thumbnail to disk 
    } 
} 
+0

JSON 응답의 데이터가 데이터베이스에 저장 중입니다.이 작업이 계약자에 의해 수행되기 때문에 구현 세부 사항을 알지 못합니다. 문제의 데이터는 복잡하지 않으며 모든 문자열, 날짜 또는 숫자 값입니다. autorelease 풀이 무엇인지 자세히 설명해 주시겠습니까? 메모리가 할당되었지만 발표되지 않았을 가능성이 있는지를 물어 보았고 이것이 문제가 아니 었음을 확신했습니다. –

+0

내 대답에 약간의 명확성을 추가했습니다. – Nico

관련 문제