【问题标题】:Why using cat | grep to search matched text is super slow为什么使用猫 | grep 搜索匹配的文本非常慢
【发布时间】:2013-03-17 08:25:48
【问题描述】:

我在命令行工具中遇到了一个非常奇怪的问题。基本上我试图搜索匹配的单词并从文件中获取文本。所以我有 80,000 字的 file1:

aaa
bbb
ccc
ddd
...

我有 600,000 行文本的 file2:

id: hhh, address: xxxx, content: yyyy
id: aaa, address: zzzz, content: eeee
id: jjj, address: qqqq, content: oooo
id: ccc, address: nnnn, content: tttt
...

我需要在file2中找到包含file1中单词的文本,所以输出如下:

id: aaa, address: zzzz, content: eeee
id: ccc, address: nnnn, content: tttt
...

现在我正在使用命令:cat file2 | grep -f file1 > newfile. 我也测试了该方法,它运行良好,运行速度也没有什么奇怪的。 但是,当我在那个真实文件上运行这个命令时,它非常慢......直到现在它已经运行了 12 个小时并且终端中的命令仍在运行!当我签入新文件时,只生成了 2000 行文本,这意味着如果我需要获得 80,000 行的全部结果,我需要 12 小时的 40 次,这绝对是荒谬的。

另外,我尝试在 file2 上做这个实验,它有 600,000 行文本。我运行了类似cat file2 | grep -w 'aaa' 的命令,不到一秒就立即得到结果。我还尝试了一个包含几个单词的文件,它也立即得到。所以我不明白,为什么这 80,000 字要花很长时间。即使搜索每个单词需要一秒钟的时间,它仍然只需要不到 20 个小时,这仍然比我目前遇到的情况要快得多......请给我一个提示吗?

我

【问题讨论】:

  • UUoCA 试试grep -f file1 file2 > newfile
  • 我试过了,它也很慢。不过还是谢谢你的帮助:)

标签: performance command-line grep cat


【解决方案1】:

在 600,000 行中的每一行中搜索 80,000 行中的每一行的代码都需要付出代价。

  • 无条件更改:使用grep -f file1 file2(不使用cat)。性能提升可能很小,但它节省了复制大文件一次。
  • 可能:添加 -F 以禁止通配符搜索。这可以避免 80,000 个已编译的正则表达式副本,这些副本实际上是简单的搜索。

    grep -F -f file1 file2
    
  • 在 GNU grep 中查找 -w 和 -x 选项。它们可能会简化搜索。
  • 拆分工作量:将80000行文件分成80个文件,每个1000行;运行该命令 80 次。

最后一个选项有点像“绝望的律师”。如果其他选项不能加快速度,这可能会让您更接近正常的性能(并且至少您将能够对搜索的每组行进行计时,以了解它将运行多长时间)。

【讨论】:

  • 谢谢我只是想把file1分成7份,每份大约需要两分钟才能得到结果。但现在我尝试了你的命令,它适用于 80,000 大小的文件!非常感谢!
猜你喜欢
  • 2016-03-31
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
  • 2022-11-12
  • 2013-04-11
  • 1970-01-01
  • 2019-08-25
  • 1970-01-01
相关资源
最近更新 更多