poxa, não reparei.<div><br></div><div>bom, gastar 6gb realmente não é confortável!</div><div><br></div><div>O DBIC nao foi feito para velocidade, e como você está usando muitas classes (internamente o find_or_create deve fazer selects que criam mais objetos gastando mais memoria,</div>

<div>então eu sugiro que, talvez seja melhor:</div><div><br></div><div>dependendo do tamanho do banco, use HashRefInflator + select=>[qw/id/] e depois joge todos os ids na chave de um HASH,</div><div>depois faça seu loop no arquivo, caso exista, você joga no arquivo X, se não existe (é insert) você joga no arquivo Y.</div>

<div><br></div><div>No final, você sobe os dois arquivos, o arquivo Y voce sobe na tabela final, e o arquivo X você sobe em uma tabela temporária e depois faz o update com uma consulta diretamente no banco, assim vai ser mais rapido (eu acho que sim, afinal, subiu os dados via copy em uma transação, depois que o dado está lá, é só atualizar)</div>

<div><br></div><div>Também é interessante inverter a ordem: faz primeiro o update com base na tabela temporaria, depois insere os novos, afinal, esses novos só vão atrasar mais o index do update.</div><div><br></div><div>

<br></div><div><br></div><div><div class="gmail_quote">2011/11/11 Stanislaw Pusep <span dir="ltr"><<a href="mailto:creaktive@gmail.com">creaktive@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

Sorry Dave, I can't do that :)<div>Mandei o código de teste minimamente suficiente para causar o leak. O processo em si é um pouco mais elaborado. Aliás, o meu caso é exatamente o oposto do que você diz: na MAIORIA dos casos (99.9%), o registro já está lá.<br clear="all">



<br>ABS()<div><div></div><div class="h5"><br><br>
<br><br><div class="gmail_quote">2011/11/11 Renato Santos <span dir="ltr"><<a href="mailto:renato.cron@gmail.com" target="_blank">renato.cron@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">



Ideia?<div>não é melhor gerar um COPY ?</div><div><br></div><div>Se der erro, remove a linha, tenta novamente... etc..</div><div><br></div><div>só não faz isso com muitos registros de uma vez (se for provavel ter um erro) pois isso no postgres gera um LOG imenso de dead-rows.<br>





<br><div class="gmail_quote">2011/11/11 Stanislaw Pusep <span dir="ltr"><<a href="mailto:creaktive@gmail.com" target="_blank">creaktive@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">



<div><div>

<div>Trazendo pra cá a conversa com @edenc no Twitter :)</div><div>Observei que um script meu (bastante simples) estava torrando 6GB de RAM mais 5GB de swap...</div><div>Consegui isolar o seguinte trecho porcalhão:</div>




<br clear="all">


<div>my $images = $schema->resultset('Image');</div><div>...;</div><div>while (my $url = <>) {</div><div>    ...;</div><div>    $images->find_or_create(</div><div>        {</div><div>            sampler_uid => $obj->uid,</div>







<div>            url         => $url,</div><div>        },</div><div>        { key => 'images_url_idx' }</div><div>    );</div><div>}</div><div><br></div><div>Curiosamente, posso substituir find_or_create() por apenas find() e o resultado é o mesmo: acréscimo de alguns KB no processo para cada operação.</div>







<div>Como tenho meio milhão de registros, deu no que deu.</div><div>Tive que trocar por isso daqui e funcionou perfeitamente:</div><div><br></div><div>my $images_insert   = $schema->storage->dbh->prepare(</div><div>







    'INSERT INTO images (sampler_uid, url) VALUES (?, ?)'</div><div>);</div><div>...;</div><div>while (my $url = <>) {</div><div>    ...;</div><div>    eval {</div><div>        $images_insert->execute($obj->uid, $url);</div>







<div>    };</div><div>}</div><div><br></div><div>Antes disso, suspeitei que tivesse algo a ver com AutoCommit e encapsulei com txn_do() a cada 100 registros; deu na mesma.</div><div>Também suspeitei do prepare_cached(), porém isso não faz o menor sentido, pois o statement é o mesmo para todas as queries. Anyway, tentei limpar $schema->storage->dbh->{CachedKids} periodicamente e também não adiantou.</div>







<div>Por fim, tentei ver o que acontece xeretando através do Devel::Size. De fato, o objeto do ResultSet cresce indefinidamente. Porém todas as minhas tentativas de serializar o mesmo e descobrir o que está acontecendo via diff foram frustradas :(</div>







<div>Any ideas?</div><div><br></div>ABS()<br><br>
<br></div></div>=begin disclaimer<br>
   Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
 SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org" target="_blank">SaoPaulo-pm@pm.org</a><br>
 L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
=end disclaimer<br>
<br></blockquote></div><span><font color="#888888"><br><br clear="all"><div><br></div>-- <br><div><font size="1" color="#333333">Saravá,</font></div><div><font size="1" color="#333333">Renato CRON Santos</font></div>

<div><div style="text-align:right">

<font size="1" color="#333333"><a href="http://www.renatocron.com/blog/" target="_blank">http://www.renatocron.com/blog/</a></font></div></div><div style="text-align:right"><font size="1" color="#333333"><a href="http://twitter.com/#!/renato_cron" target="_blank">@renato_cron</a><br>





</font></div><div style="text-align:right"><br></div><br>
</font></span></div>
<br>=begin disclaimer<br>
   Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
 SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org" target="_blank">SaoPaulo-pm@pm.org</a><br>
 L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
=end disclaimer<br>
<br></blockquote></div><br></div></div></div>
<br>=begin disclaimer<br>
   Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
 SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br>
 L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
=end disclaimer<br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div><font size="1" color="#333333">Saravá,</font></div><div><font size="1" color="#333333">Renato CRON Santos</font></div><div><div style="text-align:right">

<font size="1" color="#333333"><a href="http://www.renatocron.com/blog/" target="_blank">http://www.renatocron.com/blog/</a></font></div></div><div style="text-align:right"><font size="1" color="#333333"><a href="http://twitter.com/#!/renato_cron" target="_blank">@renato_cron</a><br>

</font></div><div style="text-align:right"><br></div><br>
</div>