2010-02-15 6 views
0

큰 개체 그래프 (76295 개체)를 인코딩하는 데 NSKeyedArchiver를 사용하고 있습니다. NSKeyedArchiver는 많은 시간이 걸리지 만 NSKeyedArchiver가 모든 메모리를 돌려주지는 못합니다.NSKeyedArchiver를 사용하여 대형 개체 그래프를 인코딩하면 메모리가 걸립니다.

누수 검사를 사용한 후 코드가 전혀 누수되지 않는 것으로 나타 났지만 어떤 이유로 든 인코딩이 완료된 후에 모든 메모리를 되돌려주지 않습니다.

encode 메서드를 여러 번 호출하면 점점 더 많은 메모리가 사라집니다.

내가 좋아할만한 의견이 있으십니까?

P. 데이터베이스 (sqlite) 또는 CoreData는 위에서 언급 한 것과 같은 큰 개체 그래프로 인해 매우 저조한 것처럼 보이기 때문에 대안이 아닙니다.

는 실제로 객체를 인코딩하지 않습니다 NSKeyedArchiver

+0

당신이 큰 개체 그래프 심하게 SQLite는/코어 데이터의 크기를 말할 때 당신은 무엇을 의미 명확하지 않다. 이 문제에 관한 대부분의 보고서는 아니 었습니다 ... –

+0

전 매장 부분을 다시 구현하여 모든 데이터를 sqlite3에 저장합니다. 데이터를 저장하는 데는 최대 3 분 (!!) 분이 소요됩니다. 내가 뭔가를 놓친 건지, NSCoder (keyed archiver)를 사용하는 것에 대한 매우 나쁜 수행 대안처럼 보입니다. 어떤 방법으로 더 빠르게 만들 수 있습니까? sqlite를 사용할 때 111000 개의 행을 저장하는 것이 너무 느립니다. –

답변

0

메모리가 나중에 간격을두고 천천히 시스템에 제공됩니다. 실제 메모리 누수가 없습니다.

다른 사람 : 코어 데이터 또는 sqlite3을 직접보십시오. sqlite3을 직접 사용하는 경우 트랜잭션의 전체 쿼리 집합을 캡슐화해야합니다. 데이터 처리량을 대폭 향상시킵니다. SQLite는 속도 최적화에 관한

더 많은 정보는 : http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html

1

NSKeyedArchiver를 사용하여 솔루션을 선호하는 것이다. 단순히 그래프를 둘러보고 그래프의 각 인스턴스에 대한 인코딩 메소드를 호출합니다. 따라서 누출 가능성이 가장 높은 소스는 사용자 정의 클래스 중 하나를 아카이브하기 위해 작성한 사용자 정의 코더 메소드 내부입니다. 개별 클래스의 테스트 아카이브를 사용하여 해당 클래스 중 하나가 누출되는지 확인할 수 있습니다.

큰 복잡한 그래프를 저장하기 위해 NSKeyedArchiver를 사용할 때의 문제는 전체 그래프가 메모리에 한 번에 쌓이는 것입니다. 하나의 클래스 코더에서 하나의 누출은 해당 클래스의 많은 인스턴스가 아카이브되면 폭발 할 수 있습니다. 76,000 개 이상의 오브젝트가 있고 각 오브젝트가 몇 바이트 만 누출된다면 서둘러 합쳐질 것입니다.

필자는 코어 데이터가 크기와 상관없이 복잡한 그래프의 아카이브보다 성능이 좋지 않은 상황을 만난 적이 없으며 읽지도 못했다고 덧붙여 야합니다. 핵심 데이터는 이러한 종류의 문제를 처리하기 위해 특별히 작성되었습니다.

코어 데이터를 사용해 보았을 때 너무 많은 엔티티 상속을 사용했기 때문일 수 있습니다. 핵심 데이터는 SQL의 상점 측에서 단일 테이블 상속을 사용하기 때문에 엔티티의 모든 하위 항목이 동일한 테이블에서 끝나고 결국에는 문제가 발생합니다. 엔티티는 모델링 한 클래스와 별개이므로 엔티티 상속없이 클래스 상속을 가질 수 있습니다. 엔티티 상속의 속도 저하없이 상속의 코딩 이점을 얻을 수 있습니다.

+0

몇 가지 테스트를 해본 결과 sqlite를 사용하여 111000 개의 객체를 저장하는 데 최대 3 분이 걸립니다. 너무 느리다. 그 위에 추가 레이어를 추가하면 (CoreData) 슬프게도 더 느려질 것입니다. –

+0

실제로 111,000 개의 새 개체를 만들고 저장하는 빈도는 얼마나됩니까? 처음 시작할 때 한 번 그렇게 할 수도 있지만 대부분의 경우, 당신은 그 물체들의 저장소에서 읽는 것일뿐입니다. 핵심 데이터는 111,000 개의 모든 객체에로드 할 필요가 없으며 필요한 객체 만로드하면됩니다. 하나를 저장하기 위해 모든 객체를 메모리에 가지고 있어야합니다. 핵심 데이터가 빠릅니다. 사전 및 배열의 ​​간단한 조합을 핵심 데이터로 대체했으며 예상치 못한 속도 증가를 보았습니다. Core Data가 큰 그래프에서 나빠진 경험에 대한 사례는 실제로 생각할 수 없습니다. – TechZen

+0

항상 슬프게도. 실제 업데이트는 단지 새로운 세트를 완료합니다. –

관련 문제