<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Arial,Helvetica,sans-serif;" dir="ltr">
<p>Opa,<br>
<br>
Yada achei muito complicado pra pouca coisa que vou fazer. Mas to convencido a tentar.<br>
<br>
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.</p>
<p><br>
</p>
<p>Exatamente aqui é o problema, IPC::ShareTable ou algo assim deve resolver. Alguma sujestão de solução ?</p>
<p><br>
</p>
<div>my $pm = new Parallel::ForkManager($req);</div>
<div>while(my $id = <$IN>){</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>$cnt++;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>chomp $id;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if ($cnt == $split || $. == $nl){ #$split = 500; </div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>push @ids, $id;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>my @tmp = @ids;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>undef @ids;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>$cnt = 0;</div>
<div><span class="Apple-tab-span" style="font-size: 12pt; white-space: pre;"></span><span style="font-size: 12pt;">$pm->start and next; # do the fork</span><br>
</div>
<div><span class="Apple-tab-span" style="font-size: 12pt; white-space: pre;"></span><span style="font-size: 12pt;">my @resp = get_fasta(\@tmp, $db, $timeout); </span><br>
</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if ($resp[0]){</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>$resp[1] =~ s/^\s*\n+//mg;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>print STDOUT $resp[1];</div>
<div><span class="Apple-tab-span" style="font-size: 12pt; white-space: pre;"></span><span style="font-size: 12pt;">}</span><br>
</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>else{</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>print STDERR "Status: $resp[2]\n$resp[3]\nDetails: $resp[1]\n";</div>
<div><span class="Apple-tab-span" style="font-size: 12pt; white-space: pre;"></span><span style="font-size: 12pt;">print STDERR join (" ", "Fail:", @tmp, "\n");</span><br>
</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>$pm->finish; #tihs is a fork, at the end (here) the memory will be released </div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>else{</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>push @ids, $id;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div>} </div>
<div>$pm->wait_all_children;</div>
<br>
<br>
<p></p>
</div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> Rio-pm <rio-pm-bounces+guedes_1000=hotmail.com@pm.org> on behalf of breno <oainikusama@gmail.com><br>
<b>Sent:</b> Wednesday, May 24, 2017 3:54:47 AM<br>
<b>To:</b> Perl Mongers Rio de Janeiro<br>
<b>Subject:</b> Re: [Rio-pm] Metodos de Download em Massa</font>
<div> </div>
</div>
<div>
<p dir="ltr">Oi Aureliano,</p>
<p dir="ltr">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.</p>
<p dir="ltr">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":</p>
<p dir="ltr">---------8<---------<br>
my $ua = Furl->new;<br>
my $res = $ua->get( '<a href="http://exemplo.com/arquivo.tmp">http://exemplo.com/arquivo.tmp</a>', Range => 'byes=' . -s 'parcial.tmp' . '-');<br>
open my $ fh, '>>', 'parcial.tmp;<br>
print $fh, $res->content;<br>
close $fh;<br>
---------8<---------</p>
<p dir="ltr">(código não testado, estou no celular)</p>
<p dir="ltr">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.</p>
<p dir="ltr">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.</p>
<p dir="ltr">[]s<br>
-b</p>
<br>
<div class="gmail_quote">
<div dir="ltr">On 23:26, Tue, 23 May 2017 Aureliano Guedes, <<a href="mailto:guedes_1000@hotmail.com">guedes_1000@hotmail.com</a>> wrote:<br>
</div>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr">
<div id="m_9146569206389881045divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Arial,Helvetica,sans-serif" dir="ltr">
<p>Ola Monges,</p>
<p><br>
</p>
<p>Gostaria de saber qual metodo vocês mais gostam para fazer downloads em massa.<br>
</p>
<p><br>
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?)
<br>
<br>
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.<br>
<br>
Tem outros metodos que posso usar mas acabo perdendo e muito a eficiência. Por isso pretendo testar um benchmark em varias formas diferentes.<br>
<br>
Bom, sei que existem ferramentas, BioPerl, etc... <br>
<br>
Abraços,<br>
acpguedes<br>
</p>
</div>
</div>
_______________________________________________<br>
Rio-pm mailing list<br>
<a href="mailto:Rio-pm@pm.org" target="_blank">Rio-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/rio-pm" rel="noreferrer" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a></blockquote>
</div>
</div>
</body>
</html>