2012-10-03 1 views
0

1500 개의 레코드가있는 표가있는 iOS 앱이 있습니다. 나는 다음과 같은 양식을 호출, FMDB를 사용하고sqlite3_prepare_v2가 너무 오래 걸리고 (느리게) 메모리를 사용하여 돌아 오지 않습니다.

:

FMDatabase *db = ... 
[db executeQuery:@"select num from a where b = ?", 6]; 

표 "a"는 "B"에 인덱스를 가지고있다.

이것은 시뮬레이터에서 정상적으로 실행되지만 iPad1에서는 매우 오랜 시간이 걸립니다. 앱이 죽을 때까지 메모리를 소모합니다. Instruments는 "sqlite3_prepare_v2"에서 멈췄다 고합니다.

원래 쿼리에도 "order by"절이있었습니다. 테스트를 위해 제거했습니다. 심지어 where 절을 완전히 제거 할 수 있으며 여전히이 방법으로 동작합니다.

어떤 아이디어가 잘못되었을 수 있습니까?

이 문제가 발생하기 전에 다른 쿼리가 작동합니다. 이전에 다른 스레드에서 데이터베이스에 액세스했지만 다른 스레드에서 액세스 할 수 없습니다. 매달린 트랜잭션이있을 수 있다고 생각했지만 그 경우도 아닙니다.

+1

"메모리를 사용합니까?"라는 메시지는 메모리 사용량이 꾸준히 증가하고 있음을 의미합니까? 그것은'sqlite3_prepare_v2' 또는 그로부터 호출 된 일부 함수에 갇혀 있습니까? 이 쿼리에 대해 별도의 DB 연결을 사용하면 아무 것도 변경되지 않습니까? –

+0

예, sqlite3_prepare_v2 호출 중에 메모리 사용이 증가합니다. 앱이 메모리 부족으로 종료 될 때까지 증가합니다. 두 번째 db 연결을 만들면 문제가 해결되지 않았지만 문제점을 좁히는 데 도움이되었습니다. 감사합니다. – David

답변

0

나는이 문제를 발견했다고 생각한다. 두 스레드가 있고 각 스레드에 대한 FMDatabase 개체가 있습니다. 내가 생각하기에 트랜잭션에서 첫 번째 데이터베이스 객체를 사용하여 많은 행을 삽입했다는 것입니다. 나는 결코 거래를 저지른 논리 오류가있었습니다.

첫 번째 데이터베이스 인스턴스에이 대기중인 트랜잭션이 있지만 두 번째 데이터베이스 인스턴스에서 동일한 테이블의 모든 트랜잭션을 선택하려고합니다.

분명히 그 상황을 일으켰습니다. 분명히 시뮬레이터에서 눈에 띠게 느리지는 않았습니다. 그러나 그것은 iPad1에서 앱이 죽었다는 충분한 시간과 메모리를 소비했습니다.

0

그래서 결과를 FMResultSet으로 가져 오시겠습니까?

FMResultSet을 사용하는 경우 [rs close]을 입력하여 결과 집합을 닫으시겠습니까?

다음은 고려해야 할 중요한 사항입니다.

+0

결과 집합을 얻기 전에 문제가 발생했습니다. sqlite3_prepare_v2 문에서 발생합니다. – David