Estoy intentando descargar más de 1 millón de páginas (URL que terminan con una ID de secuencia). Implementé un tipo de gestor de descargas multipropósito con una cantidad configurable de subprocesos de descarga y un subproceso de procesamiento. El descargador descarga archivos por lotes:¿Por qué el curl en Ruby es más lento que el curl de la línea de comandos?
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
}
He intentado descargar 8000 páginas de muestra. Cuando uso el código anterior, obtengo 1000 en 2 minutos. Cuando escribo todas las URL en un archivo y hago en shell:
cat list | xargs curl
Genero las 8000 páginas en dos minutos.
La cosa es, lo necesito para tenerlo en código ruby, porque hay otro código de monitoreo y procesamiento.
que he intentado:
- Curl :: Multi - de alguna manera es más rápido, pero no alcanza el 50-90% de los archivos (no descargarlos y da ninguna razón/código)
- con múltiples hilos Curl :: Fácil: alrededor de la misma velocidad que con un solo hilo
¿Por qué se reutiliza Curl :: Easy más lento que las llamadas curl de línea de comando posteriores y cómo puedo hacerlo más rápido? O lo que estoy haciendo mal?
Preferiría arreglar mi código de administrador de descargas que hacer la descarga para este caso de una manera diferente.
Antes de esto, estaba llamando a wget de línea de comandos que proporcioné con un archivo con una lista de URL. Howerver, no se manejaron todos los errores, tampoco fue posible especificar el archivo de salida para cada URL por separado cuando se usa la lista de URL.
Ahora me parece que la mejor manera sería usar varios hilos con la llamada del sistema al comando 'curl'. Pero ¿por qué cuando puedo usar Curl directamente en Ruby?
Códigopara el gestor de descargas es aquí, si que podría ayudar: Download Manager (He jugado con los tiempos de espera, de no-ajustarlo a diferentes valores, no parecía ayuda)
Alguna pista apreciados.
He tratado de crear sencilla llamada al sistema en lugar de rizo del rizo :: Fácil: resultado = sistema ("rizar", "s", "-o", ruta, url) y parece ser mucho más rápido. Estoy obteniendo alrededor de 300kb/s en lugar de 60kb/s con Curl :: Easy. Es extraño: la llamada al sistema con gran sobrecarga del sistema y sin conexión, la reutilización es mucho más rápida que las funciones de la biblioteca. El uso de la CPU es mucho mayor, obviamente, sin embargo, la velocidad es mucho mejor. De todos modos, esta no es una buena solución para mi problema, aunque funciona mejor. – Stiivi
¿Ha intentado utilizar versiones más recientes de curb con la interfaz Curl :: Multi.download? – todd
'lista de gatos | xargs curl' está pasando muchas URL a Curl en la línea de comandos, en lugar de una a la vez, por lo que Curl está recuperando muchas a la vez. Puedes hacerlo en Ruby con la suficiente facilidad, pero debes comparar manzanas con manzanas y usar HTTPClient o Typhoeus. –