我创建了一个脚本来验证(大(项目,并且它以串行方式(一个接一个(进行验证,并以脚本大约9的最终结果进行验证几个小时要完成。环顾四周如何改善这一点,我发现了 gnu并行,但我遇到了问题。
项目列表在文本文件中,所以我正在执行以下操作:
readarray items < ${ALL_ITEMS}
export -f process_item
parallel process_item ::: "${items[@]}"
问题是,我收到一个错误:
GNU parallel: Argument list too long
我通过查看类似的帖子1、2、3了解,这比a gnu Parallel 一个更重要。从这些帖子的答案中,我还尝试通过将项目输送到 head 来推断解决方法,但结果是只有少数项目(传递给 head 的参数(是处理。
我已经能够使用 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
so:
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}"