GNU Parallel:调用函数时参数列表太长

时间:2017-06-07 10:19:20

标签: bash gnu-parallel

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

项目列表位于文本文件中,因此我正在执行以下操作:

Public WithEvents ComboBoxEvents As MSForms.ComboBox

Private Sub ComboBoxEvents_Change()

Dim CBIndex                            As Long

' get for ID number (row number), from third character in String Name.
' e.g "Cb1" will result 1)
CBIndex = CInt(Mid(ComboBoxEvents.Name, 3))

' ??? How do I get the Value, and update the second combo-box Items

Select Case ComboBoxEvents.Value


End Select

End Sub

问题是,我收到错误:

UPDATE users SET number=number+1 OUTPUT DELETED.* WHERE ID=?

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

我已经能够使用 xargs

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

但我已经看到 GNU parallel 还有其他我想要使用的好功能。

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

由于

2 个答案:

答案 0 :(得分:3)

来自man parallel

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

所以:

export -f process_item
parallel process_item < ${ALL_ITEMS}

可能会做你想要的。

答案 1 :(得分:3)

您可以将文件换行并行,或只使用-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}"