加速zgrep从压缩的json文件中拉出匹配的行

时间:2014-10-22 20:59:23

标签: macos grep gnu-parallel

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

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

我从herehere开始使用此命令:

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?

2 个答案:

答案 0 :(得分:1)

抓取100GB的文件需要数小时才能完成,这并不奇怪。大部分时间将通过解压缩文件来消耗。如果您愿意,可以通过

估算多少
time find . -name "*.gz" | xargs zcat > /dev/null

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

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

但是,尽管如此,请尽一切努力在一次通过中提取所需的所有数据。

答案 1 :(得分:1)

GNU Parallel手册有一节专门用于为多个regexp打算多行: http://www.gnu.org/software/parallel/man.html#EXAMPLE:-Grepping-n-lines-for-m-regular-expressions