【问题标题】:GNU Parallel: Argument list too long when calling functionGNU Parallel:调用函数时参数列表太长
【发布时间】:2017-06-07 10:19:19
【问题描述】:

我创建了一个脚本来验证(大量)项目,它以串行方式(一个接一个)进行验证,脚本的最终结果大约需要 9 小时才能完成。环顾如何改进这一点,我发现 GNU 并行,但我在使它工作时遇到了问题。

项目列表在一个文本文件中,所以我正在执行以下操作:

readarray items < ${ALL_ITEMS}
export -f process_item
parallel process_item ::: "${items[@]}"

问题是,我收到一个错误:

GNU parallel: Argument list too long

通过查看类似的帖子 123,我了解到这更多是 Linux 的限制,而不是 GNU 并行。从这些帖子的答案中,我还尝试通过将项目传递给 head 来推断解决方法,但结果是只有少数项目(传递给 head 的参数)是已处理。

我已经能够使用 xargs 使其工作:

cat "${ALL_ITEMS}" | xargs -n 1 -P ${THREADS} -I {} bash -c 'process_item "$@"' _ {}

但我发现 GNU 并行 还有其他我想使用的好功能。

知道如何使用 GNU 并行 进行这项工作吗?顺便说一句,项目的数量约为 250 万,并且每天都在增长(脚本作为 cron 作业运行)。

谢谢

【问题讨论】:

    标签: bash gnu-parallel


    【解决方案1】:

    来自man parallel

    parallel [options] [command [arguments]] < list_of_arguments
    

    所以:

    export -f process_item
    parallel process_item < ${ALL_ITEMS}
    

    可能会做你想做的事。

    【讨论】:

    • 您的意思是 xargs,而不是并行:$ echo a b c |并行回显 $ _
    【解决方案2】:

    您可以通过管道将文件并行传输,或者只使用-a (--arg-file) 选项。以下是等价的:

    cat "${ALL_ITEMS}" | parallel process_item 
    parallel process_item < "${ALL_ITEMS}"
    parallel -a "${ALL_ITEMS}" process_item
    parallel --arg-file "${ALL_ITEMS}" process_item
    parallel process_item :::: "${ALL_ITEMS}"
    

    【讨论】:

    • -a|--arg-file 是 xargs 的一个选项,而不是并行:parallel --arg-file x parallel: invalid option -- '-'
    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 2016-10-18
    • 2019-06-03
    • 2017-11-30
    • 2020-05-09
    • 2014-05-21
    • 2015-04-04
    • 2021-10-26
    相关资源
    最近更新 更多