【问题标题】:minimizing run time by ordering scripts to run in the right order通过命令脚本以正确的顺序运行来最小化运行时间
【发布时间】:2023-03-15 05:41:01
【问题描述】:

我正在使用scrapy 和scrapyd 来抓取一些内容。我有 28 个爬虫在运行,但一次只有 8 个。每个爬虫需要 10 分钟到几个小时才能完成。因此,我正在寻找一种正确订购它们的方法,以最大程度地减少服务器处于活动状态的时间。

我已经收集了每次抓取需要多长时间的信息,所以这只是最小化问题,或者如何制定它。

脚本使用 php 启动,因此解决方案最好在 php 中运行。

【问题讨论】:

    标签: php scrapy minimization


    【解决方案1】:

    我发现的最佳方法是将它们设置为 cronjobs 以在特定时间执行。我有大约 30 个 cronjobs 配置为在不同时间启动,这意味着您可以为每个废料设置特定时间。

    每天下午 5 点通过 cronjob 执行 PHP 命令:

    * 17 * * * php /opt/test.php
    

    如果你通过cronjob执行scrapy python命令,它的:

    * 17 * * * cd /opt/path1/ && scrapy crawl site1
    

    如果你使用 virtualenv 为你 python 那么它的

    * 17 * * * source /opt/venv/bin/activate && cd /opt/path1/ && scrapy crawl site1
    

    【讨论】:

    • 谢谢,但不是我真正想要的。我想要一个计算最佳起始序列(队列)的脚本。更像是一个最小化问题。我使用 Laravel 来安排它,所以启动它们不是问题。
    【解决方案2】:

    很抱歉让您失望了,但您所描述的内容并没有什么聪明之处,也没有任何最小化问题,因为您没有说明任何关于爬网作业之间的依赖关系的内容。无论您如何订购,独立工作都需要 ~TOTAL_TIME/THROUGHPUT

    一旦完成,scrapyd 就会开始处理下一个作业。 “一次 8 个”不是某种桶的东西,所以这里没有组合/动态编程问题。只需将所有 28 个工作都扔给 scrapyd 并让它运行。当您轮询并发现它空闲时,您可以关闭您的服务器。

    首先安排最长的作业可能会给您带来一些好处。您可以在最后几个长时间的工作完成时,在空闲槽上快速挤压几个小工作。但除非你有病,否则这些好处不应该是主要的。

    还要注意,这个数字“8”——我猜是由max_proc_per_cpu 和/或max_proc 强制执行的——有点随意。除非这是您达到 100% CPU 或其他值的数字,否则更大的数字可能更适合。

    如果您想要获得重大收益,请找到 2-3 个最大的工作,并找到一种方法将它们减半,例如如果您正在使用车辆爬行站点,则将单次爬行分为两种,一种用于汽车,一种用于摩托车。这通常是可能的,并且会比重新排序产生更显着的好处。例如,如果您较长的工作是 8 小时,而下一个较长的工作是 5 小时,则通过将最长的爬网拆分为两个 4 小时的爬网,您将使 5 小时的爬网成为可能为您的服务器节省 3 小时的瓶颈。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-13
      • 1970-01-01
      • 1970-01-01
      • 2014-05-11
      • 2021-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多