<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>