【问题标题】:Parallel execution of a job which takes multiple inputs on Linux在 Linux 上并行执行需要多个输入的作业
【发布时间】:2015-11-21 06:07:27
【问题描述】:

我有一个包含路径列表的文件。例如:

/run/user/1007/gvfs/smb-share:server=xeonator,share=c/Results/Normals/8_mo/CNMC_N_191/ /run/user/1007/gvfs/smb-share:server=xeonator,share=c/Results/Normals/8_mo/204-196/

我有一个程序(我们称之为“prog”),它接受 3 个参数、2 个输入文件名和 1 个输出文件名。正常执行:

prog ~/A.txt ~/B.txt ~/out.txt

我想使用基于文件每一行构造的参数并行执行我的程序,例如:

prog /run/user/1007/gvfs/smb-share:server=xeonator,share=c/Results/Normals/8_mo/CNMC_N_191/A.txt /run/user/1007/gvfs/smb-share:server=xeonator,share=c/Results/Normals/8_mo/CNMC_N_191/B.txt /run/user/1007/gvfs/smb-share:server=xeonator,share=c/Results/Normals/8_mo/CNMC_N_191/out.txt
prog /run/user/1007/gvfs/smb-share:server=xeonator,share=c/Results/Normals/8_mo/204-196/A.txt /run/user/1007/gvfs/smb-share:server=xeonator,share=c/Results/Normals/8_mo/204-196/B.txt /run/user/1007/gvfs/smb-share:server=xeonator,share=c/Results/Normals/8_mo/204-196/out.txt

我一直在尝试并行使用 xargs 和 GNU,但我无法为这些工具构建合适的命令行。这是我的尝试:

cat ListPaths.txt | xargs -I '{}' -n 1 -P 8 ./SkullSegmenter/SkullSegmenter '{}'A.txt '{}'B.txt '{}'out.txt

但这并不能正确构造参数。有人可以帮我解决这个问题吗?

【问题讨论】:

标签: linux parallel-processing xargs gnu-parallel


【解决方案1】:

应该这样做:

cat ListPaths.txt | parallel ./SkullSegmenter/SkullSegmenter {}A.txt {}B.txt {}out.txt

--dry-run测试看看这些是不是你想运行的命令:

cat ListPaths.txt | parallel --dry-run ./SkullSegmenter/SkullSegmenter {}A.txt {}B.txt {}out.txt

【讨论】:

  • 我运行:cat ListPaths.txt | parallel -j 8 ./SkullSegmenter/SkullSegmenter {}SubjectBoneWithoutSuturesIndividualV2.nrrd {}RegisteredSegmentedTemplateV2.nrrd {}SegmentedSubjectV2.nrrd 我得到:SubjectBoneWithoutSuturesIndividualV2.nrrd7/gvfs/smb-share:server=xeonator,share=c/Results/Normals/18_mo/CNMC_N_118/ Exception Line: 143 SubjectBoneWithoutSuturesIndividualV2.nrrdor reading file /run/user/1007/gvfs/smb-share:server=xeonator,share=c/Results/Normals/18_mo/CNMC_N_118/ The file doesn't exist. SubjectBoneWithoutSuturesIndividualV2.nrrderver=xeonator,share=c/Results/Normals/18_mo/CNMC_N_118/
  • 看起来只有文件中的路径作为参数传递,并没有与文件名A、B和out合并。
  • 由于我不使用 SkullSegmenter,您可以使用命令echo 重新测试,并且可能使用一些简短的输入,所以它不是那么难破译吗?另外:--dry-run 给了什么?
  • 我又试了一次,这次成功了——路径传递正确。同时,我获得了 sudo 特权,因此我可以将该共享安装在更合理的位置 (~/y)。传递以~/y/ 开头的路径不起作用(找不到文件),但写入完整路径(/home/dzenan/y/)可以。通过 SSH 运行这些东西有什么不同吗?无论如何,感谢@Ole Tange 的帮助
  • GNU Parallel 引用输入,因此如果输入是 ~/y,则 GNU Parallel 将其视为 ~/y 而不是 your_homedir/y。您可以通过在命令前面加上 eval 来强制 shell 取消引用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-18
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 2019-01-16
  • 2014-06-13
  • 2015-01-26
相关资源
最近更新 更多