【问题标题】:matching string using index in java在java中使用索引匹配字符串
【发布时间】:2017-01-09 02:06:22
【问题描述】:

我有两个字符串列表。第一个是姓名列表(6MB),第二个是句子列表(大约三百万个句子)。 我想通过句子寻找每个名字。这需要几天时间。 我正在使用模式匹配并检查正则表达式,因为句子和名称是由用户生成的并且不确定。 我怎样才能更快地做到这一点?

【问题讨论】:

  • 一个合适的数据库可能会更快。
  • 我在数据库中拥有一切。我不知道如何使用索引来搜索和匹配字符串。阅读资源也可以帮助我。
  • 比创建一个完成这项工作的查询。它应该比在 java 中做任何事情都要快。
  • 您可以尝试对名称进行哈希处理,然后尝试查看每个单词是否存在哈希而不是模式匹配。
  • @KevinEsche 这个句子,并不是一个真正的句子。它是数据库中记录的所有文本信息。名称列表中的名称并不完全在文本中,因为文本是由用户生成的,它们并不完全相同。你能给我推荐一个我能理解你的意思的参考吗?

标签: java string performance indexing


【解决方案1】:

将名称列表存储在提供快速查找的数据结构中(如哈希表、BST 等)。 Java 为其中许多提供了库。

现在遍历句子列表并在创建的名称数据结构中查找每个标记。它将节省每次遍历名称列表的时间。在单线程上仍然需要时间,但可以很容易地并行化。

您可以创建多个线程(根据您的计算资源)执行相同的任务,但开始从不同位置读取句子文件。

对于更复杂的并行化,我建议使用像 Apache Spark 这样的框架,它在内存中进行计算并使任务轻松扩展到任意数量的线程。

【讨论】:

    【解决方案2】:

    我建议你看看Google BigQuery
    一旦数据加载到其中,它可以在几分钟内给你答案。它支持谓词中的类似 SQL 的语法和正则表达式。因此,您将句子加载到其中,并可以使用 where-clause 中的单词发出查询。

    最重要的是 - 与所有云服务一样,它不需要数据库管理员技能,也不需要任何维护工作。当然,你需要为此付出代价。

    我使用该工具用正则表达式搜索了包含多个文本列的 300M 记录,并且通常在一分钟内得到答案。

    需要注意的一个重要警告:此数据库支持不更新数据(不更新或删除记录)。它非常适合静态数据 - 日志文件、历史记录等。另一个重要的警告当然是数据在云中,不受您的控制。

    【讨论】:

    • 我不能把我的数据放到云端!
    • 真可惜。该产品非常适合您的要求
    猜你喜欢
    • 2021-10-19
    • 2015-06-13
    • 1970-01-01
    • 2014-08-08
    • 2020-01-07
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多