2012-07-22 3 views
1

iOS의 메모리 내장 SQLite db에 대한 스트레스 테스트를하고 있습니다.C API로 메모리 내 SQLite 데이터베이스 크기를 측정하는 방법은 무엇입니까?

잠시 후 OCUnit이이 오류를 발생 시켰습니다.

otest(79450,0xad21a2c0) malloc: *** mmap(size=40267776) failed (error code=12) 
*** error: can't allocate region 
*** set a breakpoint in malloc_error_break to debug 

저는 이것이 메모리 제한을 초과한다고 생각합니다. 하지만 현재 데이터베이스 크기를 파악할 수는 없습니다. 나는

sqlite3_status(SQLITE_STATUS_MEMORY_USED, &current, &peak, false); 

을 시도했지만이 항상 current에 대한 0 반환 및 업데이트를 통해 같은 peak 모두를위한 몇 가지 값. manual entry을 읽었지만 db 크기 기능처럼 보이지 않습니다. 나는 내가 틀린 장소를 파고 있다고 생각해. C-API로 데이터베이스 크기를 얻으려면 어떻게해야합니까?

+0

현재/피크가 int라고 가정합니다. 리턴 코드를 테스트하여 SQLITE_OK인지 확인하십시오. 이러한 호출을 코드에 뿌려 봤습니까? 0이 항상 반환된다는 것을 알았습니까? 반환 코드를 확인하고 질문을 업데이트하십시오. –

+0

사실, 실제로 '피크'는 삽입 된 데이터의 수에 관계없이 업데이트 된 값이 동일한 값을 반환하고 있음을 의미합니다. 애매한 점에 대해 유감입니다. 물론 전화에 대한 오류 검사를하고 있습니다. – Eonil

+0

이 오류가 발생하는 데 다소 시간이 걸리면 sqlite3과 관련된 누출이 없습니까? 예 : finalize 문과 함께 준비된 모든 진술은 무엇입니까? – Rob

답변

0

귀하의 의견과 mmap 오류를 기반으로, 나는 여전히 고군분투하고있는 것과 비슷한 문제, 즉 통합 버퍼 캐시의 사용 문제가 있다고 생각합니다. 내가 추측하고있는 것은 sqlite가 mmap 파일을 사용하여 "in memory"데이터베이스를 백업하고 있다는 것입니다. 따라서 통합 버퍼 캐시 (즉, 공유 메모리 풀)를 사용하는 mmap'd 메모리는 아마도 많은 malloc'd 메모리를 사용하지 않을 것입니다. (이것이 왜 큰 숫자가 보이지 않는지입니다.)

이제는 ubc 캐시가 점점 더 "더티"가되어 iOS는 어느 인스턴스에서나 사용할 수있는 메모리가 부족해지기 시작합니다. 따라서 sqlite는 더 많은 메모리를 사용하려고 시도하지만 시스템에서 사용 가능한 무료 ubc 페이지를 찾으면 사용 가능한 페이지가 없습니다. 블록을 플래시 파일 시스템으로 플러시하는 데 오랜 시간이 걸립니다.

이렇게 까다로운 문제를 만드는 이유는 메모리가 부족 해지는 것을 발견하기 위해 앱에서 할 수있는 일이 거의 없기 때문에이를 피하기위한 조치를 취할 수 있습니다.

"거대한 다운로드 이미지 표시"에서 내가 한 것은 오픈 소스 프로젝트로 내 ubc 사용량을 추적하고 전체 시스템 메모리의 50 %를 넘지 않도록합니다.

경우에 따라 sqlite를 파일 기반으로 설정 한 다음 진행하기 전에 파일을 저장하고 F_FULLSYNC (완료 대기 중)하는 것이 좋습니다. 마지막으로 높은 워터 마크를 고려한 직렬 디스패치 대기열을 통해 모든 이미지 작업을 진행했습니다.

+0

재미있는 정보를 주셔서 감사합니다 :) 단지 테스트 일 뿐이며 왜 이런 일이 발생하는지 알고 싶었습니다. 어쨌든 매뉴얼은 in-memory db (': memory :')가 순전히 메모리에 남아있을 것을 강조했다. (http://www.sqlite.org/inmemorydb.html). iOS의 SQLite가 매뉴얼과 다르게 동작하므로이 상황을 받아 들여야합니까? – Eonil

+0

이봐, 난 sqlite 내부를 모르겠다. 메모리에서 mmap'd 메모리를 의미 할 수 있습니다. 즉, 메모리가 임시 파일에 매핑되므로 모든 것이 동시에 상주해야하는 것은 아닙니다. 또는, sqllite가 40MB의 메모리를 추가하려고 시도 했으므로 시스템에서 많은 메모리를 얻을 수 없다는 것을 의미 할 수도 있습니다. 나는 문제를 추적하는 데 일주일을 보냈다. 그래서 당신에게 어느 정도 시간이 걸리고 파기도했다. 내 관심을 사로 잡은 것은 sqllite가 40M 메모리를 mmap하려고 시도했지만 현재 또는 최대 메모리가 그 근처에 없다고했습니다. –