[SP-pm] downloader survey

Stanislaw Pusep creaktive at gmail.com
Mon Oct 24 10:08:02 PDT 2011


>
> Isso depende do processo externo e de como você está forkando. Se você
> deixar pra modificar absolutamente o mínimo de dados dentro do processo
> forkado, acho bem difícil que um processo completamente novo ocupe menos
> memória, já que você se beneficia do copy-on-write.
>

Código para testar lftp:
https://metacpan.org/source/SYP/AnyEvent-Net-Curl-Queued-0.009/eg/benchmark.pl#L63

Código para testar LWP::UserAgent:
https://metacpan.org/source/SYP/AnyEvent-Net-Curl-Queued-0.009/eg/benchmark.pl#L122

Resultado: lftp é 232% mais rápido, "desprezando o atrito".

   Stanislaw> E, para mim, como programador Perl, é deveras frustrante
>    Stanislaw> delegar os downloads ao lftp (http://lftp.yar.ru/
>    Stanislaw> )... Afinal, o que o lftp tem de tão bom que eu não possa
>    Stanislaw> fazer em Perl?! ;) Então, implementei o
>    Stanislaw> AnyEvent::Net::Curl::Queued, que é capaz de gerenciar
>    Stanislaw> filas bem grandes de downloads, de forma assíncrona. Mas
>    Stanislaw> será que compensa usá-lo ao invés do lftp? Para isso,
>    Stanislaw> comecei fazendo benchmarks.  Agradeço a todos pelas
>    Stanislaw> sugestões! Seguem as minhas observações:
>
>    Stanislaw>  1. Eden, você está certo, os "filhotes" do LWP tem uma
> inicialização muito lenta; e o mais curioso é que
>    Stanislaw>     boa parte da inicialização não está no new() propriamente
> dito, mas é feita durante o primeiro request
>    Stanislaw>     (). Então, para ser justo, dividi a minha fila de
> downloads em 10 filas separadas, e aloquei um fork()
>    Stanislaw>     para cada uma;
>
> Se você fizer um "warm-up" antes de forkar, talvez tenha mais benefício.
>

Fiz; continua "pesado".


>    Stanislaw>  4. wget tem o menor overhead de todas as alternativas por
> ser ridiculamente simples. Quase não tem
>    Stanislaw>     dependências, por isso a sua inicialização é quase
>    Stanislaw>     que instantânea;
>
> Mas ainda duvido que supere um processo com uma boa implementação
> forkante.
>

Supera LWP::Curl forkante, sendo 1151% mais rápido.


>    Stanislaw>  5. AnyEvent::HTTP é a melhor alternativa para acessar uma
> quantidade limitada de URLs *em paralelo*.
>    Stanislaw>     Porém, para listas razoavelmente grandes, gerenciamento
> via callbacks e closures é meio tenebroso...
>    Stanislaw>  6. Reiterando: o *MEU* interesse se restringe a pegar meio
> milhão de URLs e baixar de forma mais
>    Stanislaw>     eficiente possível (isso é, o gargalo deve ser minha
> bandwidth, não minha CPU/RAM). Nesse caso, pouco
>    Stanislaw>     me importa a possibilidade de fazer parsing de headers,
> gerenciar cookies ou processamento de HTML.
>    Stanislaw>     Isso é, quando eu quiser, devo poder habilitar tudo isso;
> mas o default deve ser OFF. Portanto, o meu
>    Stanislaw>     "Holy Grail" seria um libwget, que gerencia filas, extrai
> links e faz downloads recursivos :)
>
> Mas e se o download precisar de auth, sessão via cookie, proxy, ou
> qualquer uma das outras bizarrices do HTTP? Se você coletar casos de uso
> típicos, pode implementar um handler otimizado pra cada caso,
> introspectar os requisitos do download e fazer um lazy-loading da
> implementação correta, isso tudo antes de forkar.


libcurl FTW :)

http://curl.haxx.se/libcurl/c/curl_easy_setopt.html
https://metacpan.org/module/AnyEvent::Net::Curl::Queued::Easy#setopt-OPTION-VALUE-OPTION-VALUE-

Não é tão obscenamente leve quanto wget, mas permite que as coisas simples
continuem simples, e as difíceis sejam possíveis ;)
-------------- Pr�xima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20111024/46575a84/attachment.html>


More information about the SaoPaulo-pm mailing list