【问题标题】:iPhone - looping through SQLite database taking too longiPhone - 循环通过 SQLite 数据库需要太长时间
【发布时间】:2011-12-18 08:15:12
【问题描述】:

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

我已经知道如何在模拟器上执行此操作,但是当我在 iPhone 上运行它时速度非常慢,循环整个数据库(大约 110000 行)大约需要 90 秒。我检查了 Instruments 并没有显示任何内存泄漏。但是,当我使用对象分配时,很明显,运行查询会为 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 的任何建议? 非常感谢 戴夫

【问题讨论】:

  • 此评论不会回答您的问题,但您可能应该看看 coredata。性能比直接使用 sqlite db 好得多。如果您确实使用 fetchedresultscontroller 设置批量大小。
  • 如果您知道 laststring 的大小最多为 81 个字母,那么您为什么不简单地使用一个静态字符串呢?不需要 alloc/init/release。
  • 感谢您的 cmets。
  • 感谢您迄今为止的建议。 rdesign - 如果我无法弄清楚这一点,我将尝试核心数据。 ott - 我试过了,它不需要分配/初始化/释放就可以工作。然而,缓慢的工作时间仍然存在。所以看起来这与释放字符串没有任何关系?那么这怎么会占用这么多内存呢?
  • 你可以显示你的 while 循环中还有什么,除非它超过 1 米长。

标签: iphone database sqlite memory loops


【解决方案1】:

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

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

够了吗?

【讨论】:

  • 否 .. 您的解决方案会将字符串添加到自动释放池中,并且在整个函数完成之前它不会释放内存,这可能是许多字符串的问题。如果你分配和释放内存是直接空闲的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多