并行用于长期运行的过滤器

并行用于长期运行的过滤器

我正在从某个网页列表中抓取电话号码,并将映射缩减实现为:

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 keep-alive),例如:

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 块(默认为 1 MB)会更有效:

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

最高速度约为 1 GB/s。对于您的使用来说,它很可能已经足够了(谁每秒处理超过 1 GB 的 URL?),但是当您需要更快的速度时,这是高效的方法(例如,当您拥有 TB 数据时很有用):

parallel -a URLS --pipepart --roundrobin my_command

每个核心可提供 1 GB/s 的速度。从版本 20150922 开始可用。

考虑每年浏览一次本教程man parallel_tutorial。您的命令行会因此而喜欢您。

相关内容