5

我有一个包含 1 亿个字符串(无重复字符串)的大型文本文件(1.5 Gb),所有字符串在文件中逐行排列。我想在java中制作一个wepapplication,以便当用户给出关键字(子字符串)时,他可以获得包含该关键字的文件中存在的所有字符串的计数。我已经知道一种技术 LUCENE..还有其他方法可以做到这一点吗??我希望在 3-4 秒内得到结果。我的系统有 4GB 内存和双核配置....需要在“仅限 JAVA”中执行此操作

4

4 回答 4

0

尝试使用哈希表。可以做的另一件事是任何类似于 MAP-REDUCE 的方法。我想说的是,你可以尝试使用倒排索引。谷歌使用相同的技术。您可以创建一个停用词文件,您可以在其中放置可以忽略的单词,例如 I、am、the、a、an、in、on 等。

这是我认为唯一可能的事情。我在某处读到用于搜索的内容,您可以使用数组。

于 2013-02-01T05:16:14.013 回答
0

由于您的 RAM 大于文件的大小,因此您可以将整个数据作为结构存储在 RAM 中并非常快速地搜索它。trie可能是一个很好的数据结构。它确实具有快速的前缀查找功能,但不确定它对子字符串的执行情况。

于 2013-02-03T16:13:55.220 回答
0

您可以根据每个单词的前几个字母构建目录结构。例如:

/A
/A/AA
/A/AB
/A/AC
...
/Z/ZU

在该结构下,您可以保留一个包含所有字符串的文件,其中第一个字符与文件夹名称匹配。搜索词中的第一个字符会将选择范围缩小到仅占整个列表一小部分的文件夹。从那里,您可以完全搜索该文件。如果速度太慢,请增加目录树的深度以覆盖更多字母。

于 2013-02-01T06:31:45.477 回答
0

您的关键字是否预计会有很多重叠?如果是这样,您也许可以存储从关键字 ( String) 到文件位置 ( ArrayList) 的哈希映射。尽管有对象开销,但您不能将所有行存储在内存中。

获得文件位置后,您可以在文本文件中查找该位置,然后查看附近以获取包含的换行符,并返回该行。那肯定会少于4秒。是有关此的一些信息。如果这只是一个小练习,那会很好用。

更好的解决方案是两层索引,一个将关键字映射到行号,另一个将行号映射到行文本。这不适合您机器上的内存。有很棒的基于磁盘的键值存储,虽然这会很好用。如果这超出了玩具问题的范围,请使用 Reddis 路线。

于 2013-02-01T05:42:36.077 回答