我创建了一个脚本来验证(大)项目,并且它以串行方式(一个接一个)进行验证,脚本的最终结果大约需要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=?
我理解通过查看类似帖子1,2,3,这更像是Linux限制而不是 GNU并行。从这些帖子的答案中我还尝试通过将项目管道到 head 来推断一种解决方法,但结果是只有少数项目(传递给 head 的参数)是处理。
我已经能够使用 xargs :
使其工作readarray items < ${ALL_ITEMS}
export -f process_item
parallel process_item ::: "${items[@]}"
但我已经看到 GNU parallel 还有其他我想要使用的好功能。
知道如何使用 GNU parallel 来完成这项工作吗?顺便说一句,项目数量约为250万,并且每天都在增长(脚本作为一个cron工作运行)。
由于
答案 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}"