我正在尝试下载超过1m个页面(URL以序列ID结尾)。我已经实现了一种多用途的下载管理器,可配置下载线程数和一个处理线程。下载程序按批次下载文件:
我尝试下载了8000页的样本。使用上述代码时,2分钟内获得1000个页面。当我将所有的URL写入文件并在shell中执行时:
我在两分钟内生成了8000页的内容。但是,由于需要进行其他监控和处理,所以需要将其写成Ruby代码。
我尝试过:
- Curl::Multi - 速度更快,但会丢失50-90%的文件(不下载并且没有原因/代码) - 使用Curl::Easy的多个线程 - 速度与单线程相同
为什么重复使用Curl::Easy比后续的命令行curl调用要慢?我该如何使它更快?或者我做错了什么?
我更喜欢修复我的下载管理器代码,而不是通过其他方式下载。
在此之前,我正在调用带有URL列表文件的命令行wget。然而,并非所有错误都被处理,而且当使用URL列表时不能为每个URL指定输出文件。
现在我认为最好的方法是使用多个线程和对“curl”命令的系统调用。但是,既然可以直接在Ruby中使用Curl,为什么还要这样做呢?
下载管理器的代码在这里,如果有帮助的话:下载管理器(我已经尝试过超时时间的设置,从不设置到各种值的调整,似乎都没有帮助)。
任何提示将不胜感激。
curl = Curl::Easy.new
batch_urls.each { |url_info|
curl.url = url_info[:url]
curl.perform
file = File.new(url_info[:file], "wb")
file << curl.body_str
file.close
# ... some other stuff
}
我尝试下载了8000页的样本。使用上述代码时,2分钟内获得1000个页面。当我将所有的URL写入文件并在shell中执行时:
cat list | xargs curl
我在两分钟内生成了8000页的内容。但是,由于需要进行其他监控和处理,所以需要将其写成Ruby代码。
我尝试过:
- Curl::Multi - 速度更快,但会丢失50-90%的文件(不下载并且没有原因/代码) - 使用Curl::Easy的多个线程 - 速度与单线程相同
为什么重复使用Curl::Easy比后续的命令行curl调用要慢?我该如何使它更快?或者我做错了什么?
我更喜欢修复我的下载管理器代码,而不是通过其他方式下载。
在此之前,我正在调用带有URL列表文件的命令行wget。然而,并非所有错误都被处理,而且当使用URL列表时不能为每个URL指定输出文件。
现在我认为最好的方法是使用多个线程和对“curl”命令的系统调用。但是,既然可以直接在Ruby中使用Curl,为什么还要这样做呢?
下载管理器的代码在这里,如果有帮助的话:下载管理器(我已经尝试过超时时间的设置,从不设置到各种值的调整,似乎都没有帮助)。
任何提示将不胜感激。
cat list | xargs curl
在命令行中一次性传递多个URL给Curl,以便同时检索多个URL。你可以在Ruby中轻松实现这一点,但是你需要进行苹果与苹果的比较,并使用HTTPClient或Typhoeus。 - the Tin Man