【发布时间】:2018-03-21 06:02:09
【问题描述】:
我有一个从 \n 分隔的流中读取数据并将信息发送到 xargs 以一次处理 1 行的作业。问题是,这还不够高效,但我知道如果我更改程序,使 xargs 执行的命令被发送多行而不是一次只发送一行,它可以大大提高我的脚本的性能。
有没有办法做到这一点?我对-L 或-n 的各种组合没有任何运气。不幸的是,我认为我也坚持使用-I 来参数化输入,因为如果我不使用-I,我的命令似乎不想采用标准输入。
基本思想是我正在尝试使用 xargs 模拟小批量处理。
从概念上讲,这与我目前所写的内容相似
contiguous-stream | xargs -d '\n' -n 10 -L 10 -I {} bash -c 'process_line {}'
^ 在上面,process_line 很容易更改,以便一次处理多行,而这个功能现在是瓶颈。强调一下,上面的-n 10 和-L 10 似乎没有做任何事情,我的线路仍在一次处理一个。
【问题讨论】:
-
xargs -I {} bash -c 'something with {}'很危险。如果您的信息流中的某一行包含$(rm -rf ~),该怎么办? -
为什么要调用
bash来执行process_line?如果它是一个独立的可执行文件,您可以直接调用它以避免安全问题和一些开销。如果它是一个 shell 函数或别名,您可以创建一个包装 shell 可执行文件来调用而不是bash -c ...。 -
@pabouk, ...同意直接调用可执行文件是首选,但如果被调用的代码是本机 shell,我不确定包装器是否购买了
bash -c,特别是 如果您有一个要尝试调用的导出函数。你能扩展吗? -
@CharlesDuffy 你是对的。这只是如何避免由 shell 评估参数引起的上述安全问题的一种替代方法。
标签: bash concurrency batch-processing xargs