【问题标题】:Run Every 10th file in directory in parallel并行运行目录中的每 10 个文件
【发布时间】:2016-02-17 00:02:35
【问题描述】:

我在 bash 中有下面的命令,它接受目录中的输入图像,并执行可执行文件“execute”,并在“结果”中输出一些图像结果和文本文件 $file 中的一些文本注释。问题是我需要为每 10 个文件并行运行它。似乎可以编写一个 shell 脚本来每 10 次处理一次。但是,我无法让并行部分工作。如何将文件名(输入图像)作为输入参数传递给 –r,并且仍然并行运行?我已经尝试了很多东西。

 for file in *.jpg; do ../../execute --model ../../modelsXX.txt -r $file.txt     
   --video ../results  --threshold=0 $file; done

我试过的链接:

Grabbing every 4th file

How to process every second file in bash?

【问题讨论】:

  • execute 到底是什么鬼? -r 选项到底有什么作用?你到底在哪里并行执行?它与每 10 个文件有什么关系?
  • @4ae1e1 它是一个可执行模块。我想为每 10 个文件并行执行 *.jpg 中的文件。那有意义吗?所以它会循环一系列图像。我需要它是并行的,每 10 个文件。我无法让它工作。
  • 仍然不能完全符合您目前所说的所有内容,但您是这个意思吗? counter=0; for file in *.jpg; do (( (counter++) % 10 )) && continue; execute blah blah "$file" & done; wait.
  • @4ae1e1 所以,非常感谢您的回复,但我真正坚持的是并行部分。我需要与一个命令并行运行它。因此,我没有使用 for 循环,而是尝试了类似下面的方法,但我无法为 $file.txt 传递文件名参数并为每 10 个图像存储文本输出。那有意义吗?我认为 for 循环方法会起作用,但我无法让上面的解决方案并行工作,所以我在下面尝试使用 seq: seq -f '%g.jpg' 1 10 1000 |并行 -j 4 ./../execute --model ../../modelsXX.txt -r --images results/ --threshold=0
  • 我的建议是使用后台,确实是并行的。

标签: bash awk command-line grep command-line-arguments


【解决方案1】:

这会计算文件数,并且只要文件数模 10 为 7(只是比选择 1 更有趣,但您可以使用任何值 0..9)在后台运行您的命令,这允许命令并行运行。

n=0
for file in *.jpg
do
    if [ $((++n % 10)) = 7 ]
    then ../../execute --model ../../modelsXX.txt -r $file.txt --video ../results --threshold=0 $file &
    fi
done
wait   # Wait for the jobs running in parallel to finish

我真正坚持的是并行部分。我需要与一个命令并行运行它。

在这种情况下,只需在循环内回显每十个名称,并将循环的输出通过管道传送到 parallel 命令:

n=0
for file in *.jpg
do
    if [ $((++n % 10)) = 7 ]
    then echo $file
    fi
done |
parallel -j 4 ./../execute --model ../../modelsXX.txt -r --images results/ --threshold=0

parallel 命令的语法未经测试并从您的笔记中复制。

【讨论】:

  • 所以,非常感谢您的回复,但我真正坚持的是并行部分。我需要与一个命令并行运行它。因此,我没有使用 for 循环,而是尝试了类似下面的方法,但我无法为 $file.txt 传递文件名参数并为每 10 个图像存储文本输出。那有意义吗?我认为 for 循环方法会起作用,但我无法让上面的解决方案并行工作,所以我在下面尝试使用 seq: seq -f '%g.jpg' 1 10 1000 |并行 -j 4 ./../execute --model ../../modelsXX.txt -r --images results/ --threshold=0
  • 问题是当我运行它时,我需要将 $file 作为输入传递给 -r(参见上面的第一篇文章)。当我运行您的上述解决方案时,我在“提供了多个图像/数据集”的基础上收到以下错误。这有意义吗?
  • 所以您的解决方案有效,但我无法将 $file 输出为文本文件。有意义吗?
  • 那么,您希望并行运行程序的 4 个副本,并在 -r 选项之后和 --images 选项之前插入一个文件名?你看过 GNU parallel 的文档吗?它没有解释如何做到这一点吗?鉴于您想一次并行运行一个命令,那么使用 & 会怎样,正如我最初展示的那样,哪个可以完成相同的工作?使用parallel 程序有什么好处?
  • 名义上,您可以在需要文件名的地方使用{}parallel -j 4 ./../execute --model ../../modelsXX.txt -r {}.txt --images results/ --threshold=0 {}。您可能需要一些额外的语法;我不是parallel 的用户。
猜你喜欢
  • 2020-11-22
  • 1970-01-01
  • 2012-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-17
  • 1970-01-01
  • 2015-09-02
相关资源
最近更新 更多