在非常大的文件中快速搜索字符串

2024-02-28

在包含字符串的文件中搜索行的最快方法是什么?我有一个包含要搜索的字符串的文件。这个小文件 (smallF) 包含大约 50,000 行,如下所示:

搜索字符串1
字符串搜索2
字符串搜索3

我必须在一个更大的文件中搜索所有这些字符串(大约1亿行)。如果这个较大文件中的任何行包含搜索字符串,则打印该行。

到目前为止我想出的最好的方法是

grep -F -f smallF largeF

但这并不是很快。在smallF 中仅搜索 100 个字符串,大约需要 4 分钟。对于超过 50,000 个搜索字符串,这将花费大量时间。

有没有更有效的方法?


我曾经注意到使用-E或多个-e参数比使用更快-f。请注意,这可能不适用于您的问题,因为您正在较大的文件中搜索 50,000 个字符串。不过,我想向您展示可以做什么以及什么可能值得测试:

这是我详细注意到的:

有 1.2GB 文件,其中填充了随机字符串。

>ls -has | grep string
1,2G strings.txt

>head strings.txt
Mfzd0sf7RA664UVrBHK44cSQpLRKT6J0
Uk218A8GKRdAVOZLIykVc0b2RH1ayfAy
BmuCCPJaQGhFTIutGpVG86tlanW8c9Pa
etrulbGONKT3pact1SHg2ipcCr7TZ9jc
.....

现在我想使用不同的 grep 方法搜索字符串“ab”、“cd”和“ef”:

  1. 使用不带标志的 grep,一次搜索一个:
    grep "ab" strings.txt > m1.out  
    2,76s user 0,42s system 96% cpu 3,313 total
    
    grep "cd" strings.txt >> m1.out  
    2,82s user 0,36s system 95% cpu 3,322 total
    
    grep "ef" strings.txt >> m1.out  
    2,78s user 0,36s system 94% cpu 3,360 total

所以总共搜索花费了近10秒.

  1. 使用 grep 与-fsearch.txt 中带有搜索字符串的标志

     >cat search.txt
      ab
      cd
      ef
    
     >grep -F -f search.txt strings.txt > m2.out  
     31,55s user 0,60s system 99% cpu 32,343 total
    

由于某些原因,这几乎需要32秒.

  1. 现在使用多种搜索模式-e

     grep -E "ab|cd|ef" strings.txt > m3.out  
     3,80s user 0,36s system 98% cpu 4,220 total
    

    or

     grep --color=auto -e "ab" -e "cd" -e "ef" strings.txt > /dev/null  
     3,86s user 0,38s system 98% cpu 4,323 total
    

第三种方法使用-E只拿了4.22秒搜索文件。

现在让我们检查结果是否相同:

cat m1.out | sort | uniq > m1.sort  
cat m3.out | sort | uniq > m3.sort
diff m1.sort m3.sort
#

diff 不产生输出,这意味着找到的结果是相同的。

也许想尝试一下,否则我建议您查看线程“最快的 grep”,请参阅赛勒斯的评论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在非常大的文件中快速搜索字符串 的相关文章