2010-02-14 3 views
1

아이폰의 db 테이블 테이블에서 약 6,000 개의 행을 가져온 다음 정보를 기반으로 6,000 개의 객체를 생성하고 배열로 채우는 과정을 순환하는 다음과 같은 메소드가 있습니다. Objective-C에서이 sqlite db 쿼리/개체 생성 속도를 어떻게 향상시킬 수 있습니까?

while 루프

다소 느린 내가이 속도를 높일 수있는 방법에 어떤 생각 (내 장치에 그들을 통해 반복 ~ 10 초 소요)?

TKS !!!

NSMutableArray *dees    = [[NSMutableArray alloc] init]; 

if(sqlite3_open([database_path UTF8String], &database) == SQLITE_OK) { 
    const char  *sqlStatement = "select cn, gn, df, or, id from doits order by lower(cn)"; 
    sqlite3_stmt *compiledStatement; 
    if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) { 

    //loop through the results and feed them into the array 
    while(sqlite3_step(compiledStatement) == SQLITE_ROW) { 
     // Read the data from the result row 
     NSString *a_cn    = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)]; 
     NSString *a_gn    = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)]; 
     NSString *a_df    = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)]; 
     NSString *an_or   = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 3)]; 
     NSString *ident   = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 4)]; 

     DL *dl = [[DL alloc] init]; 
     dl.cn   = a_cn; 
     dl.gn   = a_gn; 
     dl.df   = a_df; 
     dl.or   = an_or; 
     dl.primary_id = [ident intValue]; 
     [dees  addObject:dl]; 
    } 
} 
sqlite3_finalize(compiledStatement); 

답변

2

런타임에 6K를 모두 만드는 이유는 무엇입니까? 필요한 경우에만 게으른로드 및 필요한 항목 만 만드는 방법은 어떻습니까?

아이폰은 데스크톱 PC가 아니며, 400MHz CPU이며 6K 결과를 반복하는 속도가 느립니다.

테이블의 색인이 제대로 설정되어 있습니까? 스키마를 가능하게 최적화 할 수 있습니까 (필드 유형?)? 6K 요소를 반복하는 것을 제외하고는 실제로 많이하지 않습니다. 따라서 루프를 최적화 할 수있는 직접적인 방법은 없습니다.

나는 큰 그림을보고 게으른로드 또는 부분적으로 데이터를로드하는 방법을 찾으려고합니다. UITableView를 채우기 위해 데이터를 사용한다고 가정 해 보겠습니다. 완전한 객체가 아닌 첫 번째 레이어 만 필요할 수도 있습니다.

편집 :

내가 필드 유형을 의미하는 것은 당신이 당신의 데이터베이스에 4 배 "sqlite3_column_text"텍스트 필드를 가지고있다. 텍스트 필드를 사용해야합니까, 아니면 작고 어쩌면 데이터에 최적화 된 것을 사용할 수 있습니까?

+0

예, jQuery과 채우려면 6,000 행을 사용하고 있습니다. tableview는 사용자가 검색 상자에 타이핑하여 "실시간"필터링 할 수 있습니다 ....내 검색어에서 검색된 모든 필드는 실시간 검색에서 검색됩니다. 그래서, 내가 틀린 생각을하지 않는다면 (당연히 가능할 수도 있습니다), 처음부터 6,000 개의 행이 모두 필요하다고 생각합니다. 나는 완전히 본격적인 객체가 아닌 "첫 번째 레이어"가 무엇을 의미하는지 확신 할 수 없습니다. NSArrays의 NSArray에 모든 것을 넣는 것이 좋습니다. TKS – user141146

+0

또한 스키마 최적화와 관련하여 "필드 유형"이 무엇을 의미하는지 잘 모르겠습니다. – user141146

+0

6,000 개 요소를 모두 빠르게로드하는 방법은 없습니다. 따라서 한 번에 6,000 개의 모든 요소를로드하지 않는 방법을 찾아야합니다. 컨테이너 클래스를 NSArray보다 더 똑똑하게 만들 수 있으며, 6k 개 요소를 모두로드하지 않고 일부만로드합니다. 검색이 시작되면 컨테이너 클래스는 메모리의 항목에서 요청을 수행 할 수 있는지 또는 데이터베이스에서 더 많은로드가 필요한지 (게으른 검색) 결정할 수 있습니다. 또는 테이블의 모든 열을로드해야합니까, 아니면 요소의 일부만로드하고 나머지는 필요에 따라 검색 할 수 있습니까? – justin

0

Mr-sk가 말했듯이 메모리와 성능상의 이유로 6,000 개의 모든 요소를 ​​동시에로드하는 것은 좋지 않습니다. 지정된 시간에 화면의 요소 만로드하도록 가져 오기를 배치 할 수 있습니다. 검색을 실행하려면 데이터베이스에 대해 쿼리를 수행해야합니다.

코어 데이터를 사용하도록 데이터 모델을 전환하려는 경우이 일괄 처리 된 가져 오기는 NSFetchResultsController 및 -setFetchBatchSize :를 NSFetchRequest로 사용하면 간단 해집니다. 테이블 뷰에 필요한 데이터 만 전달하면이 클래스가 설계 한 것입니다. 검색의 경우, 검색 기준에 따라 결과를 필터링하는 NSFetchRequest를 제공 할 수 있습니다. 이렇게하면 응용 프로그램의 성능이 크게 향상됩니다.

0

결과 개체를 배열에 추가 한 후에는 성능을 향상시킬 수 있는지 확인하고 해제 할 수 있습니까?

[dees addObject : dl];

[d1 방출];

당신이하고있는 일은 hte 객체를 즉석에서 생성하고 Array에 추가하는 것이지만 실제로 추가 된 객체는 해제하지 않습니다. 그것은 내가 추측하는 메모리 누출이다.

감사

수레 쉬 쿠마르 Narayanasamy

관련 문제