장기 실행 필터의 경우 병렬

장기 실행 필터의 경우 병렬

웹페이지 목록에서 전화번호를 스크랩하고 다음과 같이 지도 축소를 구현했습니다.

PARALLEL_OPTS="..."
SCRIPT="curl --silent --cookie '$COOKIES' {} | egrep -o '[2-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' | sort -u"
cat URLS | parallel $PARALLEL_OPTS "$SCRIPT" >> numbers

URL이 동일한 서버에 있고 각 호출이 curl새로운 연결을 사용하기 때문에 이는 비효율적입니다. 대신 연결(HTTP 연결 유지)을 재사용하고 싶습니다. 예를 들면 다음과 같습니다.

cat URLs | wget -q --input-file=- --output-document=- 2>/dev/null

parallel매개변수를 사용하여 여러 번 호출하는 대신 프로세스를 사용하고 STDIN을 통해 작업을 전달하는 방법이 있습니까 ?

답변1

첫 번째:

PARALLEL_OPTS="..."

$PARALLEL을 사용하면 GNU Parallel이 자동으로 선택합니다.

--pipe여기서는 wget한 번에 1000개의 URL을 제공합니다 .

cat URLS | parallel --pipe -n 1000 wget -q --input-file=- --output-document=- '2>/dev/null'

그러나 행 수를 계산하지 않고 URL 블록(기본값은 1MB)만 제공하는 것이 더 효율적입니다.

cat URLS | parallel --pipe --block 1M wget -q --input-file=- --output-document=- '2>/dev/null'

최고 속도는 약 1GB/s입니다. 사용하기에 충분할 가능성이 높지만(초당 1GB 이상의 URL을 처리하는 사람은 누구입니까?) 더 빠른 속도가 필요할 때(예: 테라바이트의 데이터가 있는 경우) 매우 유용합니다.

parallel -a URLS --pipepart --roundrobin my_command

각 코어는 1GB/s를 제공합니다. 버전 20150922부터 사용 가능합니다.

1년에 한 번씩 이 튜토리얼을 검토해 보세요 man parallel_tutorial. 당신의 명령줄은 당신을 좋아할 것입니다.

관련 정보