【问题标题】:Bash/Shell : Reducing Time ConsumptionBash/Shell:减少时间消耗
【发布时间】:2016-04-14 05:24:51
【问题描述】:

我有一个 python 脚本 domaincheck.py 和一个 json 文件 domain.json 我可以查找任何 domainname 并给我查询域的 name

#Usage 1 : python domaincheck.py cnn.com 
#Usage 2 : python domaincheck.py bbc.com    

#Result 1 : CNN
#Result 2:  BBC

现在,我有一个输入文件 set_3.txt,它包含大约 65000 行域。我为批处理编写了一个小的 shell 逻辑。

$for i in $(cat set_3.txt); do python domaincheck.py $i;done 

我在六个小时前运行了这个脚本,到现在它只处理了大约 20,000 个域。

如何使用 Bash/shell 有效地做到这一点并减少时间消耗? bash 中是否有任何并行执行方法可以用来最小化处理时间?

【问题讨论】:

  • 看看GNU parallel
  • 谢谢赛勒斯。也会看看 GNU 并行方法。
  • 要小心——如果您几乎同时启动 65,000 个查询,您可能会超载 DNS 服务器的容量。尽量保持200个左右的批次。
  • 在 Python 中执行循环比在 shell 中循环要高效得多(并行, xargs)。在这里启动 Python 解释器将是您的大部分成本——Python 在标准库中拥有自己的并行机制。

标签: python json bash shell


【解决方案1】:

使用GNU parallel

$ parallel -a set_3.txt -j+0 -k "python domaincheck.py {}"

-j 核数,j+0 表示核数。并行作业数等于 num。核心数

-k保持输出顺序与输入顺序一致

GNU Parallel 可以并行使用多核。但是python进程每次都会运行。

进程创建开销效率低。

无论如何它比单进程更快,因为操作系统使用所有内核,而且最简单。

还有另一种简单的并行化方法,http://www.parallelpython.com/

【讨论】:

【解决方案2】:

您希望输出显示还是重定向到输出?

不管怎样,试试这个(重定向):

for i in $(cat set_3.txt)
do
 echo "$i $(python domaincheck.py $i)" >> temp.csv &
 sleep  1
done

可能有更好的方法来做到这一点。如果您有足够的 RAM 和 CPU,您甚至可以启动并发 python 进程(在您的情况下为 65000)。

【讨论】:

  • 是的,我会将标准输出重定向到一个文件。谢谢你的逻辑。将不得不为一些并发执行方法更改我的 python 脚本。
  • mywiki.wooledge.org/DontReadLinesWithFor -- 你想要while read i; do ...; done <set_3.txt
  • 使用sleep 1,这不可能少于 18 小时。事实上,它可能比原来的要慢!但是如果你把sleep拿出来,你就会面临其他问题。
  • 哦,是的,我没有想到这一点(虽然和睡眠).. 我的错...如果机器可以处理域列表,也许可以将域列表拆分为 10 个文件并同时运行加载,如果可行的话。
【解决方案3】:

韩是对的。而不是多次调用 python 会产生进程创建开销,而是使用 python 代码本身来解析输入文件并启动多个线程/进程来执行任务

【讨论】:

    猜你喜欢
    • 2016-07-04
    • 1970-01-01
    • 2012-08-31
    • 2018-10-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多