Paralela para filtro de longa duração

1

Eu estou raspando números de telefone de uma determinada lista de páginas da web e implementei redução de mapa como:

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

Isso é ineficiente porque as URLs estão no mesmo servidor e cada chamada de curl usa uma nova conexão. Em vez disso, eu gostaria de reutilizar as conexões (HTTP keep-alive) como:

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

Existe uma maneira de executar parallel que usa um processo e passa o trabalho através de STDIN, em vez de várias invocações com argumentos?

    
por William Entriken 18.08.2016 / 16:40

1 resposta

0

Primeiro:

PARALLEL_OPTS="..."

Se você usar o $ PARALLEL, o GNU Parallel os selecionará automaticamente.

Você está procurando por --pipe . Aqui, damos wget 1000 URLs por vez:

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

É, no entanto, um pouco mais eficiente não contar as linhas, mas apenas fornecer um bloco de URLs (1 MB é o padrão):

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

Isso maximiza em torno de 1 GB / s. Para seu uso é mais provável (quem processa mais de 1 GB de URLs por segundo?), Mas no dia em que você precisa de mais velocidade, essa é a maneira altamente eficiente (por exemplo, útil quando você tem TBs de dados):

parallel -a URLS --pipepart --roundrobin my_command

Ele pode fornecer 1 GB / s por núcleo. Disponível a partir da versão 20150922.

Considere percorrer o tutorial uma vez por ano man parallel_tutorial . Sua linha de comando vai te amar por isso.

    
por 18.08.2016 / 17:49