【问题标题】:run command taking two arguments with GNU parallel使用 GNU 并行运行带有两个参数的命令
【发布时间】:2015-10-03 14:14:27
【问题描述】:

我有一个 perl 程序,它接受两个参数,字典文件由 英文单词每行一个,并且包含连接单词的文件也每行一个 行,类似这样:

lovetoplayguitar
...
...

所以通常程序是这样使用的:

perl ./splitwords.pl words-en.txt bigfile.txt

它将结果打印到stdout

我试图通过GNU parallel 像这样:

time parallel -n 2 -j8 -k perl ./splitwords.pl {1} {2} ::: words-en.txt bigfile.txt > splitted.txt

但它不能那样工作.. 到目前为止尝试了许多组合但无法 使用并行运行它。

编辑

实际上这似乎有效,但它只使用一个核心..?为什么..?

【问题讨论】:

  • 您希望 GNU Parallel 运行什么? GNU Parallel 不能神奇地并行化您的程序,但它可以运行具有不同参数的程序的多个副本。你希望它用什么参数来运行你的程序?
  • 这是我面临的一个问题,因为这两个参数是两个文件名,它们被传递给那个 ./splitwords.pl 程序,所以它只接受这两个,它们是相同的
  • 如果您不知道如何手动将任务拆分为更小的任务,那么让 GNU Parallel 为您完成几乎是不可能的:它无法猜测如何并行化任务。看来您认为任务可以并行化,您能解释一下如何将任务拆分为更小的作业吗?
  • 我能想到的唯一方法是,将大文件分割成更小的块,然后将它们作为第二个参数并行输入,第一个参数保持不变,因为它包含字典

标签: gnu-parallel


【解决方案1】:

这会将大文件分成 1 MB 的块:

cat bigfile.txt | parallel --pipe --cat -k perl ./splitwords.pl words-en.txt {}

如果 perlscript 只读取文件,那么这会更快:

cat bigfile.txt | parallel --pipe --fifo -k perl ./splitwords.pl words-en.txt {}

【讨论】:

  • 是的,它只接受文件作为参数,所以第二个。
  • so --fifo 就像命名管道?
  • 是:--fifo 创建一个命名管道(在 GNU Parallel 退出时将其删除)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多