日志文件处理之间的性能比较

日志文件处理之间的性能比较

我正在处理大约 10GB 大小的大型日志文件,并使用 zgrep 进行模式匹配。但现在用例变得有点复杂,我无法使用 zgrep,所以我将逻辑更改为 awk,这导致了很多性能问题。

Time
using zgrep ~1.5 minutes
using awk ~11 minutes
using python ~ 13 minutes

我尝试在谷歌上寻找可能的解决方案,但找不到任何解决方案。如何有效地解析 .gz 文件?

输入示例

String1:"Hello"
String2:"World"
String3:"Question"
End
String1:"HelloAgain"
String5:"Answer"
End
String1:"NewEntry"
String2:"Foo"
String5:"NewFile"
End

示例输出

Hello World
HelloAgain
NewEntry Foo

这是原来的问题使用 shell 迭代某些模式

答案1

如果您所做的只是在单独的行上进行模式匹配,那么速度几乎不可能被击败grep(或者zgrep- 这基本上只是 的更奇特的实现)。zcat | grep这是grep唯一的目的,并且它已经针对该任务进行了数十年的优化。

这也是唯一grep能做的事情。这也是它如此之快的部分原因。

如果您需要做的事情不止于此(例如,如果一行与某个模式匹配,则输出该行的一部分;如果第一个条件为真,并且第二行与不同的模式匹配,则可选地输出另一行的一部分 - 正如您的任务中所示),那么这就很多了更复杂,超出了我们的grep能力范围。

这种复杂程度本质上比简单的模式匹配要慢。这是无法避免的。程序需要做更多的工作,而且永远都会有更多的工作。

尽管如此,某些语言在特定事物上比其他语言更快,并且至少同样重要的是,您选择实现任务的算法(即您选择如何执行任务)可能会对性能产生巨大影响。

当处理中小型文件时,性能差异微不足道,甚至可能不明显,但当处理大文件时(或重复运行数千次),即使很小的性能差异也会累积起来并对运行产生非常显着的影响。时间。

awk例如,与or perlor相比,您原来的 shell 脚本会慢得多python(至少需要几个小时而不是几分钟) - 这是因为 sh 不太擅长这些任务。在 sh 中,循环文件中的输入数据特别慢。 shell 的主要目的是用于交互式和/或脚本化作业控制,而不是自行进行复杂的文本处理(bash并且在这方面zsh比普通旧的更强大,但是像or 之sh类的专用文本处理语言总是会更好并且更快)。awkperl

简而言之:

  • 选择最适合工作的工具
  • 实现一个好的、快速的算法。

顺便说一句,“最好”不仅是最适合这项工作的工具,而且部分是您最了解的工具,以及用该语言编写您需要的内容是多么容易。例如,对于许多任务,awk并且perl具有大致相似的性能(awk通常更快一点,但perl有更多的内置函数和一个巨大的代码库可以做几乎任何你能想到的事情,称为CPAN)。如果您比 perl 更了解 awk,那么就使用 awk。反之亦然。

我倾向于使用 awk 来完成更简单的工作,使用 perl 来完成更复杂的工作。有时我使用 python,但我写的大多数东西比 python 更适合 perl,而且我对 perl 的了解比对 python 的了解要好得多。

相关内容