Trazendo pra cá a conversa com @edenc no Twitter :) Observei que um script meu (bastante simples) estava torrando 6GB de RAM mais 5GB de swap... Consegui isolar o seguinte trecho porcalhão:
my $images = $schema->resultset('Image'); ...; while (my $url = <>) { ...; $images->find_or_create( { sampler_uid => $obj->uid, url => $url, }, { key => 'images_url_idx' } ); } 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. Como tenho meio milhão de registros, deu no que deu. Tive que trocar por isso daqui e funcionou perfeitamente: my $images_insert = $schema->storage->dbh->prepare( 'INSERT INTO images (sampler_uid, url) VALUES (?, ?)' ); ...; while (my $url = <>) { ...; eval { $images_insert->execute($obj->uid, $url); }; } Antes disso, suspeitei que tivesse algo a ver com AutoCommit e encapsulei com txn_do() a cada 100 registros; deu na mesma. 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. 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 :( Any ideas? ABS()
=begin disclaimer Sao Paulo Perl Mongers: http://sao-paulo.pm.org/ SaoPaulo-pm mailing list: SaoPaulo-pm@pm.org L<http://mail.pm.org/mailman/listinfo/saopaulo-pm> =end disclaimer