GNU Parallel:调用函数时参数列表太长
GNU Parallel: Argument list too long when calling function
我创建了一个脚本来验证(大量)项目,它以串行方式(一个接一个)进行验证,脚本的最终结果需要大约 9 个小时才能完成。环顾四周如何改进这一点,我发现 GNU parallel 但我在使其工作时遇到了问题。
项目列表在文本文件中,所以我执行了以下操作:
readarray items < ${ALL_ITEMS}
export -f process_item
parallel process_item ::: "${items[@]}"
问题是,我收到一个错误:
GNU parallel: Argument list too long
我通过查看类似的帖子 1, 2, 3 了解到,与 GNU parallel 相比,这是一个 Linux 限制。从这些帖子的答案中,我还尝试通过将项目管道传输到 head 来推断一种解决方法,但结果是只有少数项目(传递给 head[ 的参数=37=]) 被处理。
我已经能够使用 xargs:
使其工作
cat "${ALL_ITEMS}" | xargs -n 1 -P ${THREADS} -I {} bash -c 'process_item "$@"' _ {}
但我已经看到 GNU parallel 还有其他我想使用的不错的功能。
知道如何使用 GNU parallel 进行这项工作吗?顺便说一下,项目的数量大约是 250 万,并且每天都在增长(脚本 运行 作为 cron 作业)。
谢谢
来自man parallel
:
parallel [options] [command [arguments]] < list_of_arguments
所以:
export -f process_item
parallel process_item < ${ALL_ITEMS}
可能会如您所愿。
您可以通过管道将文件并行传输,或者只使用 -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}"
我创建了一个脚本来验证(大量)项目,它以串行方式(一个接一个)进行验证,脚本的最终结果需要大约 9 个小时才能完成。环顾四周如何改进这一点,我发现 GNU parallel 但我在使其工作时遇到了问题。
项目列表在文本文件中,所以我执行了以下操作:
readarray items < ${ALL_ITEMS}
export -f process_item
parallel process_item ::: "${items[@]}"
问题是,我收到一个错误:
GNU parallel: Argument list too long
我通过查看类似的帖子 1, 2, 3 了解到,与 GNU parallel 相比,这是一个 Linux 限制。从这些帖子的答案中,我还尝试通过将项目管道传输到 head 来推断一种解决方法,但结果是只有少数项目(传递给 head[ 的参数=37=]) 被处理。
我已经能够使用 xargs:
使其工作cat "${ALL_ITEMS}" | xargs -n 1 -P ${THREADS} -I {} bash -c 'process_item "$@"' _ {}
但我已经看到 GNU parallel 还有其他我想使用的不错的功能。
知道如何使用 GNU parallel 进行这项工作吗?顺便说一下,项目的数量大约是 250 万,并且每天都在增长(脚本 运行 作为 cron 作业)。
谢谢
来自man parallel
:
parallel [options] [command [arguments]] < list_of_arguments
所以:
export -f process_item
parallel process_item < ${ALL_ITEMS}
可能会如您所愿。
您可以通过管道将文件并行传输,或者只使用 -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}"