0

我有大约 100k 个 gzip 压缩的 JSON 文件,它们总共等于大约 100GB。所有文件都在同一个目录中。我在我的 mac os x 上本地运行它。

我有几种不同的模式要匹配,并尝试以多种方式运行命令,但它们都需要几个小时才能完成。

我从这个命令开始,从这里这里拉:

find . -name "*.gz" | xargs zgrep pattern >> results.json

这工作正常,但需要大约 4 小时才能完成。

我试图将它与一种或多种模式并行化:

find . -name "*.gz" | parallel zgrep pattern >> results/melanys.json

find . -name "*.gz" | parallel zgrep -e pattern1 -e pattern2 -e pattern3 -e pattern4 >> results/melanys.json

这些确实会产生多个 zgrep 进程,但大多数时候它们是空闲的,并且它们似乎运行得没有更快(在单模式解决方案中),并且在我决定关闭之前,多模式解决方案运行了 8 小时它下来。

我没想到 zgrep 真的会花这么长时间——我希望从这个数据集中 zgrep 相关行,然后将它们插入到更适合分析的结构中,也许是本地数据库。

有没有办法加快zgrep?

4

2 回答 2

1

zgrepping 100GB 的文件需要几个小时才能完成,这并不奇怪。大部分时间将仅通过解压缩文件来消耗。如果你愿意,你可以估计多少

time find . -name "*.gz" | xargs zcat > /dev/null

在这种情况下,您可以使用这些文件集合廉价地做任何有用的事情。如果您的 zgrep 不受 I/O 限制,那么您可能希望从并行化中获得一些优势,但在这种情况下,最好的结果可能是与您机器中的 CPU 内核数量成比例的加速。在实践中你不会看到那么多加速,如果 zgrep 是 I/O 绑定的,你也不会看到任何加速。

您还可以考虑将数据放在速度更快的介质上,例如固态驱动器或由此类驱动器组成的 RAID 阵列。即便如此,您也不太可能从需要几个小时变成只需要几分钟。

但是,无论如何,请尽一切努力一次提取您想要的所有数据。

于 2014-10-22T21:28:05.847 回答
1

GNU Parallel 的手册有一节专门用于为多个正则表达式 grepping 多行: http ://www.gnu.org/software/parallel/man.html#EXAMPLE:-Grepping-n-lines-for-m-regular-expressions

于 2014-10-23T08:48:13.343 回答