[Rio-pm] Metodos de Download em Massa

Aureliano Guedes guedes_1000 em hotmail.com
Qua Maio 24 13:05:34 PDT 2017


Então, esses no caso to pegando do NCBI.

Muita gente vai dizer que tem e-utilities, BioPerl, mas convenhamos que epost, efetch não são muito eficientes para dataset largos, um curl e furl ja baixam mais rápido. BioPerl é dispensável pra pra um simples get.

E ja baixei o que precisava, inclusive eu tinha outro script pra essa tarefa, so que agora to usando muitos datasets todos na faixa dos 2-3 milhoes de entradas cada.

________________________________
From: Rio-pm <rio-pm-bounces+guedes_1000=hotmail.com em pm.org> on behalf of Felipe Leprevost <leprevostfv em gmail.com>
Sent: Wednesday, May 24, 2017 7:53:48 PM
To: Perl Mongers Rio de Janeiro
Subject: Re: [Rio-pm] Metodos de Download em Massa

Apenas como curiosidade Aureliano, de onde você está tentando obter os arquivos ?

On Wed, May 24, 2017 at 3:21 PM Felipe da Veiga Leprevost <felipe em leprevost.com.br<mailto:felipe em leprevost.com.br>> wrote:
Apenas como curiosidade Aureliano, de onde você está tentando obter os arquivos ?

On Wed, May 24, 2017 at 3:19 PM Aureliano Guedes <guedes_1000 em hotmail.com<mailto:guedes_1000 em hotmail.com>> wrote:

Opa,

Yada achei muito complicado pra pouca coisa que vou fazer. Mas to convencido a tentar.

Breno, o truncado é por causa que estou fazendo varios downloads com o Parallel::ForkManager de um arquivo no formato texto, onde cada identificador é um dado do arquivo, como eu trabalho com milhoes desses identificadores e o servidor recomenda se limitar a 500 por requisição acaba que tenho que fazer varios downloads. So que to imprimindo tudo em STDOUT e redirecionando a saida pra um aarquivo estilo UNIX mesmo > , então tem varios processo tenetando escrever na tela ao mesmo tempo, eu pensei em fazer um lock mas acho q isso vai fazer demorar.


Exatamente aqui é o problema, IPC::ShareTable ou algo assim deve resolver. Alguma sujestão de solução ?


my $pm = new Parallel::ForkManager($req);
while(my $id = <$IN>){
$cnt++;
chomp $id;
if ($cnt == $split || $. == $nl){ #$split = 500;
push @ids, $id;
my @tmp = @ids;
undef @ids;
$cnt = 0;
$pm->start and next; # do the fork
my @resp = get_fasta(\@tmp, $db, $timeout);
if ($resp[0]){
$resp[1] =~ s/^\s*\n+//mg;
print STDOUT $resp[1];
}
else{
print STDERR "Status: $resp[2]\n$resp[3]\nDetails: $resp[1]\n";
print STDERR join (" ", "Fail:", @tmp, "\n");
}
$pm->finish; #tihs is a fork, at the end (here) the memory will be released
}
else{
push @ids, $id;
}
}
$pm->wait_all_children;



________________________________
From: Rio-pm <rio-pm-bounces+guedes_1000=hotmail.com em pm.org<mailto:hotmail.com em pm.org>> on behalf of breno <oainikusama em gmail.com<mailto:oainikusama em gmail.com>>
Sent: Wednesday, May 24, 2017 3:54:47 AM
To: Perl Mongers Rio de Janeiro
Subject: Re: [Rio-pm] Metodos de Download em Massa


Oi Aureliano,

se você está interessado em benchmarks, pode experimentar o LWP::Curl em vez do Furl, ou se tiver paciência pra ir direto ao metal, Net::Curl ou WWW::Curl.

O que quer dizer com "truncado"? Se a conexão cai depois de X bytes baixados (e se vc consegue garantir que o arquivo parcial contém apenas dados válidos), vc pode baixar só o que falta e depois juntar os dois pedaços na mão. Por exemplo, se o arquivo parcial foi baixado em "parcial.tmp":

---------8<---------
my $ua = Furl->new;
my $res = $ua->get( 'http://exemplo.com/arquivo.tmp', Range => 'byes=' . -s 'parcial.tmp' . '-');
open my $ fh, '>>', 'parcial.tmp;
print $fh, $res->content;
close $fh;
---------8<---------

(código não testado, estou no celular)

Se o servidor suporta conteúdo parcial (ele responde o primeiro request com Accept-Ranges), isso deve baixar o resto do arquivo. Idealmente, em vez de sobrescever o arquivo parcial, vc junta o conteúdo dos dois em um terceiro arquivo.

Finalmente, se quiser baixar vários pedaços do arquivo em paralelo, pode experimentar o HTTP::Range e o LWP::Parallel::UserAgent, ou se inspirar neles e implementar sua própria solução paralela com Furl ou LWP::Curl.

[]s
-b

On 23:26, Tue, 23 May 2017 Aureliano Guedes, <guedes_1000 em hotmail.com<mailto:guedes_1000 em hotmail.com>> wrote:

Ola Monges,


Gostaria de saber qual metodo vocês mais gostam para fazer downloads em massa.

Eu usava muito LWP, recentemente comecei usar uma combinação de Parallel::ForkManager e Furl, mas pra meu tipo de dado tem truncado parte dos download. (vale uma dica pra lidar com dados truncados?)

No meu caso, eu to fazendo download de mais me milhoes de sequencias, pra isso eu sigo a regra do servidor e peço apenas 500 por vez e limito em 10 fork.

Tem outros metodos que posso usar mas acabo perdendo e muito a eficiência. Por isso pretendo testar um benchmark em varias formas diferentes.

Bom, sei que existem ferramentas, BioPerl, etc...

Abraços,
acpguedes

_______________________________________________
Rio-pm mailing list
Rio-pm em pm.org<mailto:Rio-pm em pm.org>
http://mail.pm.org/mailman/listinfo/rio-pm
_______________________________________________
Rio-pm mailing list
Rio-pm em pm.org<mailto:Rio-pm em pm.org>
http://mail.pm.org/mailman/listinfo/rio-pm
--
Felipe da Veiga Leprevost, Ph.D.
www.leprevost.com.br
Proteome Bioinformatics Lab
University of Michigan
--
Felipe da Veiga Leprevost, Ph.D.
www.leprevost.com.br
Proteome Bioinformatics Lab
University of Michigan
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/rio-pm/attachments/20170524/37393265/attachment-0001.html>


Mais detalhes sobre a lista de discussão Rio-pm