iPhone - 在SQLite数据库中循环需要太长时间

时间:2011-10-30 19:52:57

标签: iphone database sqlite memory loops

嗨,大家好,希望你能提供帮助。我正在尝试为iPhone应用程序创建一个anagram检查器。我想要做的是能够获取最多81个字母的长串,然后在单词列表中检查这个字符以查找任何长度的所有可能的排列。

我已经想出如何在模拟器上执行此操作,但是当我在iPhone上运行它时,它非常慢,大约需要90秒来循环遍历整个数据库(大约110000行)。我检查了仪器,它没有显示任何内存泄漏。但是,当我使用对象分配时,很明显运行查询会为CFString创建一个大量分配,从而消耗其他所有内容。这会立即在整个字节列下运行3.09 MB。 (在下面的代码中,我已经删除了所有的字谜检查代码,因为我想确定导致问题的原因。所以这一切目前都是通过数据库循环而没有任何输出。)

//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的任何建议? 非常感谢 戴夫

1 个答案:

答案 0 :(得分:-1)

为什么要在while()循环中分配NSString?

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

就足够了吗?