Eu estava com problemas de memória ao fazer uma simples consulta SQL via Perl utilizando o módulo DBI com o Mysql. Como eu sabia que a quantidade de registros retornados eram muitos (mais de 100 milhões), acabei utilizando o método fetchrow_array e escrevia a saída direto em um arquivo texto (melhor perder espaço em disco do que acabar com a memória do servidor, rs...).
Apesar da minha precaução, o script Perl consumia toda a memória no servidor. Pesquisando um pouco descobri que o driver DBD::mysql utilizando pelo DBI, por padrão, carrega todos os dados na memória ao chamarmos o método $sth->execute (mysql_store_result). Para evitar isso, devemos habilitar o método mysql_use_result, que lê os dados um a um do banco de dados ao utilizarmos o método fetchrow_array :
my $sth = $dbh->prepare($sql);
$sth->{"mysql_use_result"} = 1;
$sth->execute;
Com isso, meu script não consumia nem 1% da memória do servidor.
OBS: Não esqueça de utilizar o método $sth->finnish antes de fazer outra requisição ao banco de dados.
DBD::mysql por padrão carrega todo o resultado das consultas SQL na memória
Postado por
Thiago Yukio Kikuchi Oliveira
on segunda-feira, 13 de julho de 2009
/
Marcadores:
Bioinformática,
Perl
0 comentários:
Postar um comentário