【问题标题】:Ultra-fast "Begins With" Query from Disk来自磁盘的超快速“Begins With”查询
【发布时间】:2010-12-11 20:44:50
【问题描述】:

我有一个 40MB(在这种情况下对内存来说太大)的字符串列表,我想“开始”查询以提取匹配项。任何人都知道一个好的数据结构吗?现有 os java 实现的奖励积分。如果某些东西已经存在,我愿意牺牲“开始于”来精确匹配。基于磁盘的 trie 听起来很理想。

【问题讨论】:

  • 字符串的长度是否相同?将所有填充到最长的长度会是一个问题吗?
  • 字符串源的结构/架构是什么?它是一个 40gb 行分隔的文本文件吗?这是用来制造垃圾邮件的吗? ;)
  • 只有 40 mb 而不是 gb,它们是单独的条款。它基本上只是为了一个术语(
  • 如果您想要超快,我建议您获得 40 MB 以上的可用内存。你是在为手机开发吗?你愿意使用 SQL 但不将数据加载到内存中??我会说后者更简单。

标签: java string search


【解决方案1】:

看起来你需要这样的东西:http://en.wikipedia.org/wiki/Trie

可以在here 中找到 Java 实现,尽管它不是基于磁盘的。我会继续寻找:/

有用的论文:Trie methods for text and spatial data on secondary storageB-tries for disk-based string management

编辑:我发现这可能有用:MG4J: Managing Gigabytes for Java™

【讨论】:

    【解决方案2】:

    无法推荐任何现有的库,但我之前处理过类似的问题。如果您不打算动态修改列表并且可以对文件中的字符串进行排序(用于二进制搜索),这很容易。

    让我们将 40Mb 分成 1000 个大小大致相等的块,并将每个块的第一个字符串保留在内存中。那将是一个包含 1000 个字符串的数组。它们是有序的,因为原始列表是有序的。
    当您需要执行查询时,可以在该数组上使用二进制搜索。这将向您显示结果字符串位于哪个块中。然后你可以从磁盘读取那个块(大约 40kb)并搜索它的内容。

    例如,如果数组包含值 ["andrew", "brian", "donald", "john"] 并且您搜索前缀 "cris",则您知道所有 Cristophers 和 Cristians 都在第二个块中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-20
      • 1970-01-01
      • 2010-10-04
      • 2020-01-30
      • 1970-01-01
      • 2018-10-25
      • 2023-03-30
      • 2020-07-14
      相关资源
      最近更新 更多