我有一个很大的输入文件,其中包含 30M 行,\r\n
.我想通过将 1000 行的块(或更少,对于文件的其余部分)发送到带有curl
.
我尝试了以下方法:
< input.xt tr -d '\r' | xargs -P 8 -r -d '\n' -n 1000 -I {} curl -s -X POST --data-binary '{}' http://...
请注意,我首先从输入中删除\r
's ,因为它似乎无法拆分多个字符。tr
xargs
然而,上面的命令似乎仍然只为进程提供一行curl
,尽管是curl
并行的 8 个进程(因为参数-P 8
)。
如何修复此命令,以便将 1000 行的块传递给curl
,同时保持并行性?
我知道这些线路将以随机顺序到达 REST 服务,这对于我的用例来说很好。
答案1
GNU Parallel 就是为此而构建的:
< input.xt parallel -P 8 -d '\r\n' -n 1000 curl -s -X POST --data-binary '{}' http://...
如果您想保留 \r\n,请使用--pipe
.默认传递 ~1 MB 的块:
< input.xt parallel -P 8 --pipe curl -s -X POST --data-binary @- http://...
答案2
-I {}
并且-n
不兼容。-n n
告诉xargs
将n
参数传递给命令并-I {}
获取一个参数,并且每次出现的{}
都会被它替换。
如果我理解正确的话,你希望每次调用curl
都有一参数由传递给其 的 1000 行组成--data-binary
。所以也许:
<input.txt awk '{print}; NR % 1000 == 0 {printf "\0"}' |
xargs -r0 -P8 -I {} curl -s -X POST --data-binary {} http://...
这会在每 1000 行(包括 CRLF 分隔符)之后插入一个 NUL,并xargs -r0
在这些行上进行拆分。
我怀疑网站的维护者会感激您发送这么多请求。另请注意,并行的输出curl
可能最终会严重交错。
另请注意,在 Linux 上单个参数的大小不能大于 128KiB。