我正在研究GNU Parallel totorial。在“多个参数”部分中,有以下示例(注意:num30000是连续行上编号为1到30,000的文本文件):
为了更好的并行性,GNU Parallel可以在满足文件结束时在所有并行作业之间分配参数。
并行运行4个作业会将最后一行参数分成4个作业,共计5个作业:
cat num30000 | parallel --jobs 4 -m echo | wc -l
输出:
5
我的问题是:为什么我们预计会有5个工作岗位?我显然错过了一点,虽然我不知道这是否重要。我预计有4个工作,因为30,000可以被4整除。我决定在运行以下内容后发布这个问题:
cat num30000 | parallel --jobs 4 -m echo | colrm 12
导致:
1 2 3 4 5 6
23696 23697
25273 25274
26850 26851
28427 28428
这看起来像第一个echo
命令传递了前23,695个参数。然后,其余的被分成4个作业,参数计数分别为1577,1577,1577和1574.我是否误解了对并行的调用应该做什么?谢谢!
答案 0 :(得分:4)
这个答案的价格是帮助我以一种方式改进这个例子,以便你在第一次阅读时理解它。
所以会发生以下情况:
GNU Parallel发现限制为131071.然后它会看到当前正在运行的作业数(0)。这是否小于并行运行的作业数量(4):然后它读取到131071限制的参数并启动该作业。这是第一份工作。
现在GNU Parallel再次读取参数。这次它会读取所有其余内容并命中文件末尾。 “哦,”GNU Parallel认为。 “如果这是文件的结尾,那么我将在所有作业槽(4)上传播所有参数。”因此,它需要所有其他参数并将它们分散到4个作业中。然后它开始3个工作。现在有4个工作正在运行。
其中一个正在运行的工作完成,提供一个免费的工作岗位;所以GNU Parallel开始了最后的工作。
如果你有4个核心和100个参数,这个设计的原因会更清楚:100个参数很容易适合一行,但通常在4核机器上运行4个25个args的作业比运行1个更快有100个工作的工作。
答案 1 :(得分:3)
我现在正在理解这门语言。 -m
参数要求并行将尽可能多的参数放到命令行中。我的131071个字符的限制意味着生成了两个echo
个命令。第一个有23695个。第二个有其余的。 --jobs 4
参数仅影响第二个命令。这就是教程所指的“最后一行参数”。所以,我理解为什么总共有5个工作岗位。但是,我不明白为什么--jobs
只影响最后一行参数,但这不是我问的问题。