fgrep可以处理多少个搜索字符串?

fgrep可以处理多少个搜索字符串?,grep,pattern-matching,Grep,Pattern Matching,我有一个文本文件(大约1.5GB),我想搜索特定标题的出现。我的名单上大约有1000万本书 显然,并非列表中的每个标题都会存在于文本文件中。没关系。我只需要知道文本中有哪些标题 现在,如果只是几百个标题,我会使用fgrep并告诉它从文件中读取搜索字符串(即fgrep-f patternlist.txt bigtextfile.txt) 但是fgrep会被这么多的数据阻塞吗 要将我的标题列表和文本文件转换成一种可以与fgrep一起使用的格式需要做一点工作,所以在我开始这项工作之前,我想知道这是否可

我有一个文本文件(大约1.5GB),我想搜索特定标题的出现。我的名单上大约有1000万本书

显然,并非列表中的每个标题都会存在于文本文件中。没关系。我只需要知道文本中有哪些标题

现在,如果只是几百个标题,我会使用
fgrep
并告诉它从文件中读取搜索字符串(即
fgrep-f patternlist.txt bigtextfile.txt

但是
fgrep
会被这么多的数据阻塞吗

要将我的标题列表和文本文件转换成一种可以与
fgrep
一起使用的格式需要做一点工作,所以在我开始这项工作之前,我想知道这是否可行

另一个选项是将标题列表拆分为多个文件,并为每个子列表运行一次
fgrep
。这并不疯狂,前提是
fgrep
可以处理相当多的搜索字符串。如果它能处理100万,那就不用动脑筋了。如果它不能处理100000次(需要100次以上的个人跑步),那么它就不是一个有吸引力的选择


那么,有没有人有使用
fgrep
搜索大量字符串的经验?如果没有,是否有其他可用的程序?我可以在一两天内写我自己的,但如果我能避免这项工作

fgrep
使用以下发明可以很好地扩展:

  • 更新:

当然,您的模式列表会被读取、编译并保存在内存中。大的输入文件可以通过
--mmap
选项进行内存映射,以获得最佳的资源利用率--内核将文件映射到内存区域;应用程序本身不知道如何访问,但整个文件只需一个简单的内存地址即可访问。

谢谢。我熟悉该算法的工作原理,毫无疑问,它可以有效地匹配大量字符串。问题在于fgreq是否能够在不耗尽内存的情况下处理1000万个输入字符串,或者在构建DFA时花费了相当长的时间。在1.5千兆字节,我不认为输入文件特别大,并且有足够的内存,标准OS文件缓存应该足够了。Iulian Moraru和David G. Andersen的研究项目(为文本快速缓存:加速与前馈布鲁姆过滤器的精确模式匹配)对现有(f)grep实现的边界有很好的印象。我自己,我从来没有联系过他们。正如我所说,要把我的数据转换成正确的格式来尝试这个,需要几个小时的工作。我希望在我花时间之前其他人也试过了,是吗?通常会提供一个解释性的注释。Re“如果它不能处理100000次(需要100次以上的单独运行),那么它是一个不太吸引人的选项”,我不确定这是否会有问题,因为您可能会编写运行脚本。您可以获得所需格式的文本,然后让脚本在搜索词上迭代,每次100000次,然后运行单个
grep
命令。您不必手动键入每个命令。如果您想对每个进程执行(比如)一个搜索项,那么进程启动时间可能会导致问题,但每次100000个搜索项不会产生太大影响。