【问题标题】:How to Filter NSArray of around 200,000 NSDictionaries efficiently?如何有效过滤大约 200,000 个 NSDictionaries 的 NSArray?
【发布时间】:2014-01-09 10:21:54
【问题描述】:

我正在开发一个示例应用程序,当用户每次在搜索栏中输入任何字符时,我都必须根据输入的字符过滤 200,000 个NSDictionary 元素中的NSArrayNSDictionary 仅包含两个键,即“English”和“Meaning”;

到目前为止,我在 UISearchBar delegate 方法中执行以下操作

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    NSPredicate *searchPredicate = [NSPredicate predicateWithFormat:@"%K contains[cd] %@",@"English",searchText];

    _searchResult = [_dictionaryData filteredArrayUsingPredicate:searchPredicate];
}

我觉得这不是一个合适的方法,过滤也需要时间。

附注- NSArray 我正在使用核心数据填充

【问题讨论】:

  • 如果有人不知道:10 万 = 100000。
  • 如果数据来自核心数据获取请求,那么这可能会有所帮助:stackoverflow.com/a/21002171/1187415
  • 使用TRIE类型的数据结构。en.wikipedia.org/wiki/Trie
  • @MartinR 该答案建议(在您的共享链接中)我已经在做。当应用程序启动时,我将数据加载到一个数组中并将该数组用作数据源,我不会每次都访问磁盘。
  • 我很想知道它的性能。搜索 200K 记录,在移动设备上,任何时候你输入一个字符......所以,如果“e”你有 199K 的点击,你把它们全部返回?还是“The”,45K 次点击?编写软件规范的人到底在想什么?

标签: ios core-data nsarray


【解决方案1】:

如果您强调效率,您应该将给定的单词音译成某种“规范化”形式,该形式仅由 ASCII 字符组成。将这些词保存在专用的NSArray 或其他某种容器中(例如std::vector)。

搜索字符串必须以相同的方式音译。然后,搜索功能将是高效的,因为它只需要在给定单词中找到给定的搜索字符串作为子字符串。

您可以在不使用谓词的情况下实现搜索算法。最好不要使用NSArrayNSString,而是使用std::vector<std::string>,即使用C++。

您通过在附加的NSDictionary 中查找来获得找到(规范化)单词的含义。

对于将字符串转换为音译形式,您可以查看以下参考资料:

【讨论】:

    【解决方案2】:

    或许更好的办法是将所有这些都放入 SQLLite 数据库并使用 SQLLite 机制对其进行过滤。

    我不认为使用 NSArray 可以比谓词更快。

    此外,它还会大大提高您的应用程序的内存使用量 - 一次将所有这些条目放入内存根本没有意义。最好只保留屏幕上可见的那个 - 如果你使用 CoreData 有一个简单的方法 - 检查NSFetchedResultsController

    如果您想要一些好的 Core Data 教程,请点击:

    http://www.raywenderlich.com/934/core-data-tutorial-for-ios-getting-started

    【讨论】:

    • 我必须使用核心数据。在 NSArray 中使用谓词过滤对象是否比查询数据库昂贵?
    • 这样,数据库将变得更快+在此过程中不会消耗太多内存。如果你把所有的东西都保存在一个 NSArray 中,你可能会白白使用大量的内存,因为你不需要所有的数据都在内存中。
    • 好的!!!我是核心数据的新手,你能建议一些使用核心数据有效查询数据库的方法吗?
    • 好的,我已经尝试了一些方法,我得到了“未实现的谓词 SQL 生成”,我是如何形成谓词的,我将在下一条评论中发布,请查看并指出我的内容我失踪了
    • NSManagedObjectContext *managedObjectContext = [self managedObjectContext]; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:ENTITY_NAME inManagedObjectContext:managedObjectContext]; NSPredicate *searchPredicate = [NSPredicate predicateWithFormat:@"%K contains[cd] %@",@"泰米尔语",searchText]; [fetchRequest setPredicate:searchPredicate]; [fetchRequest setEntity:实体]; _dictionaryData = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 2011-11-11
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多