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
불구하고 여전히 process에 대해 한 줄만 제공하는 것으로 보입니다 .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보다 클 수 없습니다.