【问题标题】:Searching NSMutableArray v.s. Sqlite search query搜索 NSMutableArray 与Sqlite 搜索查询
【发布时间】:2013-07-01 08:46:40
【问题描述】:

我有一个具有相对较大的 SQLite 数据库的应用程序,其中包含大约 15,000 行。在应用程序开始时,我运行SELECT * FROM TABLE 查询并填充包含ProverbRow 类元素的NSMutableArray *data。每个ProverbRow 对象对应于数据库中的一行数据,并包含与数据库的每个单元格对应的NSStrings 和NSIntegers。因此,NSMutableArray *data 对象实际上是 SQLite 数据库的副本。

现在,问题...

我想在应用中添加 搜索 功能,如下例所示:

当用户输入“abc”并点击搜索时,我想获取data 的所有元素,其中ProverbRow 对象内的NSString *proverb 包含字符串“abc”作为子字符串。所以,应该得到“abcde”、“qqqabcqqq”等字符串。

目前,为了实现这一点,我正在发出这样的查询:SELECT * FROM PROVERB WHERE PRONUNCIATION LIKE abc。我从查询中返回的对象存储在另一个 NSArray 中以供进一步使用。

现在,如果只有少量对象被返回,那么这个查询就足够快地完成,但是如果行数较多,则需要很多时间。

我想知道除了触发查询之外是否有更快的方法来完成此操作。是否可以使用已经填充的 data 对象并通过循环运行它并等同于子字符串或类似的东西? 我主要关心的是减少搜索时间。

谢谢!

【问题讨论】:

    标签: ios sqlite search


    【解决方案1】:

    15 k 很小。只需对内存中的对象进行线性扫描。

    以下测试在字母表末尾找到 xyz 15000 次。在我的 iPhone 5 上重复此过程 100 次需要 4.7 秒。对于返回每个元素的完整扫描来说,这是 47 毫秒。

    NSMutableArray * data = [[NSMutableArray alloc] initWithCapacity:15000];
    for (int i = 0; i < 15000; ++i)
        [data addObject:@[@"abcdefghijklmnopqrstuvwxyz", @123]];
    
    NSLog(@"Starting test");
    int count = 0;
    for (int i = 0; i < 100; ++i) {
        NSIndexSet * s = [data indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
            NSString * s = obj[0];
            return [s rangeOfString:@"xyz"].location != NSNotFound;
        }];
        count += s.count;
    }
    NSLog(@"Finished test: %d", count); // Outputs 1500000
    

    让我重申一下:15 k 很小。

    【讨论】:

    • this 这样填充的 NSMutableArray 的线性扫描会比搜索查询快吗?
    • 我通过快速分析修改了我的答案。直接回答您的问题:是的,它会更快,因为您避免了从动态类型磁盘存储格式通过 SQLite 的 VM 并最终通过其 API 的大量开销。如果 SQLite 可以使用索引,它将具有显着的优势,但它不能使用LIKE '%abc%'。因此,它没有优势,也没有机会对抗原始原生代码。
    • 是的,我实现了这段代码,哇,它的速度有了巨大的提升!谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多