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
複数の文字に分割できないように見えるので、最初に入力から 'を削除しました。tr
xargs
ただし、上記のコマンドは、(パラメータのために)8つのプロセスが並列に接続されているにcurl
もかかわらず、まだプロセスに対して1行しか提供していないようです。curl
-P 8
curl
並列性を維持しながら1000行のチャンクを渡すようにこのコマンドを変更するにはどうすればよいですか?
私はラインがランダムな順序でRESTサービスに到着することを知っていますが、これは私のユースケースに適しています。
答え1
GNU Parallelは以下のために作成されました:
< input.xt parallel -P 8 -d '\r\n' -n 1000 curl -s -X POST --data-binary '{}' http://...
\r\n を保存するには、--pipe
デフォルトで ~1MB チャンクを渡す 。
< 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を超えることはできません。