簡體   English   中英

iPhone-遍歷SQLite數據庫花費的時間太長

[英]iPhone - looping through SQLite database taking too long

大家好,希望您能提供幫助。 我正在嘗試為iPhone應用程序創建一個字謎檢查器。 我想要做的是能夠容納最多81個字母的長字符串,然后對照單詞列表進行檢查,以找到任何長度的所有可能排列。

我已經找到了如何在模擬器上執行此操作的方法,但是當我在iPhone上執行此操作時,它的運行速度非常慢,大約需要90秒才能遍歷整個數據庫(大約110000行)。 我檢查了樂器,它沒有顯示任何內存泄漏。 但是,當我使用對象分配時,很明顯,運行查詢會為CFString創建大量分配,從而耗盡所有其他內容。 這將立即在“總字節數”列下運行3.09 MB。 (在下面的代碼中,我剝離了所有的字謎檢查代碼,因為我想確定是什么引起了問題。因此,目前所有這些操作是通過db循環而沒有任何輸出)。

//create query
    NSString *querySQL2 = @"SELECT name FROM table ";

    sqlite3_stmt *statement2;
    const char *query_stmt2 = [querySQL2 UTF8String];



    sqlite3_prepare_v2(contactDB, query_stmt2, -1, &statement2, NULL);


    //loop through all rows of database
    while (sqlite3_step(statement2) == SQLITE_ROW)
    {
        NSString *laststring = [[NSString alloc] initWithUTF8String:
                          (const char *) sqlite3_column_text(statement2, 0)];



        [laststring release];
        }


    sqlite3_finalize(statement2);
   sqlite3_close(contactDB);

    }

對我來說,顯而易見的是,下面“ laststring”的創建正在消耗所有內存。 那為什么當我放[laststring release]時卻如此? 在while循環結束時似乎沒有效果? 我已經運行了此代碼,並且沒有釋放,並且消耗了相同數量的內存。 我也嘗試過在其周圍包裝自動發行版,但這也沒有任何效果。

我已經閱讀了有關通過SQLite循環的其他一些查詢。 他們中的一些建議建立索引,但是我不確定這會為我節省大量時間。 另外,如果我要從一個由81個字母組成的大字符串中搜索所有可能的排列,我想無論如何至少需要檢查單詞列表的50%。

關於如何降低CFString的任何建議? 非常感謝Dave

為什么要在while()循環內分配NSString?

while(sqlite3_step(compiledStatement) == SQLITE_ROW) 
      {
      NSString *laststring = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement2, 0)];    
      // do something with laststring
      }

就足夠了嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM