使用awk并行


1

我有大约3,000个文件,每个300MB,我想用我的16核心服务器尽快搜索它们的一系列子串。

这是我尝试过但它似乎并没有并行搜索文件。

sudo find /mnt2/preprocessed/preprocessed/mo* | sudo xargs awk '/substring/ {c++} END {print c}' | paste -sd+ | bc

它是从不同的方法粘贴在一起的,我不完全理解它。您对我如何分割文件处理有什么建议吗?


1
你可能是I / O,而不是CPU限制。
Nicole Hamilton

它是一个高I / O实例(hi1.4xlarge ec2),但你可能是对的。我仍然想知道如何在这种情况下使用GNU parallel但是无法使它工作。
kelorek

Answers:


1
  1. 看看你是否有 parallel 你的系统上的程序。 (它可能来自GNU。) 如果你这样做,弄清楚如何使用它。除此以外,
  2. 跑你的 find 输出到文件。使用文本编辑器,或者可能使用像 head,将该文件分成16个片段文件,其中(大约)相等数量的行(即,引用相同数量的找到的文件)。然后开始16 awk … | paste … | bc 管道;每个片段文件一个。 (并添加16个结果。)

我想知道你为什么要使用它 awk 计算字符串的出现次数 grep -c 是专门为此而设计的。


1

GNU parallel与xargs非常兼容,在你的情况下它可以替换它。如果你只计算出现次数 substring 使用 grep -c 斯科特 建议:

sudo find /mnt2/preprocessed/preprocessed/mo* | 
  sudo parallel grep -c source | paste -sd+ | bc

请注意,某些版本的GNU / Linux在“Tollef的并行”兼容模式下安装GNU并行。你可以通过添加来改变它 --gnu 到并行的命令行参数。要使更改永久添加 --gnu~/.parallel/config


由于某些原因,Grep比awk慢得多,这就是我使用awk的原因。
kelorek

这对我来说不起作用 - 当我只使用并行代替xargs时它不会处理任何事情。
kelorek

发布'parallel --version'的输出
Ole Tange

@kelorek:awk比grep快吗?您使用的是什么版本的grep和awk?在我的测试中计算200M文件中的出现次数 awk 需要3.7秒, grep -c 需要1.2秒和 grep -Fc 需要0.005s。
Thor
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.