我正在尝试下载超过 100 万页(以序列 ID 结尾的 URL)。我已经实现了一种多用途下载管理器,具有可配置的下载线程数和一个处理线程。下载器批量下载文件:
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 调用慢,我怎样才能让它更快?或者我做错了什么?
我宁愿修复我的下载管理器代码,也不愿以不同的方式下载此案例。
在此之前,我正在调用命令行 wget,我提供了一个带有 URL 列表的文件。然而,并非所有错误都得到处理,使用 URL 列表时也无法分别为每个 URL 指定输出文件。
现在在我看来,最好的方法是使用多线程系统调用“curl”命令。但是为什么我可以在 Ruby 中直接使用 Curl 呢?
下载管理器的代码在这里,如果它可能有帮助:下载管理器(我玩过超时,从不设置它到各种值,它似乎没有帮助)
任何提示表示赞赏。