Java 通过搜索在内存中设置
Java Set in memory with search
我需要在内存中缓存大量数据,并且能够非常高效地进行搜索。它本质上是一个字符串列表,对于给定的输入,我想 return 包含该输入的字符串列表。
例如,如果列表包含以下字符串:
abc def
def ghi
ghi jkl
并且输入是:
ef
我想return前两个字符串作为输出(最好按字母顺序)。
我在想用一个JavaSet的实现,把所有的字符串放在里面,放在内存里。对于任何给定的输入,我将遍历 Set
并使用 String.contains()
查找包含输入的记录,并将结果添加到另一个 Set
或 List
.
这是完成此任务的最有效方法吗?性能非常重要,数据量非常大(10 兆字节)。如有必要,我可以为此目的拥有一个具有大量内存的专用服务器实例。
Set
或 HashSet
尤其不会提供出色的性能,因为您必须遍历整个 set
并执行 contains
来检查是否输入是一个子串。你肯定需要一个字符串数据结构。
- 特别看看 Suffix trees and Generalized suffix tree,它给你 O(m) 的时间来检查 S 的长度是否为 m 是子字符串或存在于树中。
- 您可以构建一个 inverted index
最后,您可以只使用 Lucene,它是 Java 的文本倒排索引,也可以在堆外工作
我需要在内存中缓存大量数据,并且能够非常高效地进行搜索。它本质上是一个字符串列表,对于给定的输入,我想 return 包含该输入的字符串列表。
例如,如果列表包含以下字符串:
abc def
def ghi
ghi jkl
并且输入是:
ef
我想return前两个字符串作为输出(最好按字母顺序)。
我在想用一个JavaSet的实现,把所有的字符串放在里面,放在内存里。对于任何给定的输入,我将遍历 Set
并使用 String.contains()
查找包含输入的记录,并将结果添加到另一个 Set
或 List
.
这是完成此任务的最有效方法吗?性能非常重要,数据量非常大(10 兆字节)。如有必要,我可以为此目的拥有一个具有大量内存的专用服务器实例。
Set
或 HashSet
尤其不会提供出色的性能,因为您必须遍历整个 set
并执行 contains
来检查是否输入是一个子串。你肯定需要一个字符串数据结构。
- 特别看看 Suffix trees and Generalized suffix tree,它给你 O(m) 的时间来检查 S 的长度是否为 m 是子字符串或存在于树中。
- 您可以构建一个 inverted index
最后,您可以只使用 Lucene,它是 Java 的文本倒排索引,也可以在堆外工作