get_results em grandes conjuntos de dados

6

Estou experimentando um problema muito preocupante usando uma consulta SQL personalizada. Eu tenho uma tabela personalizada do MySQL chamada trading_datas com 165 linhas para 4,4Mo. Um campo datas da minha tabela é um grande array serializado.

Ao solicitar desta forma:

$querystr = "SELECT item, datas FROM trading_datas";
$result = $wpdb->get_results( $querystr, 'ARRAY_A' );

meu script PHP pára e nada é reproduzido logo após a linha. Ao recuperar apenas item , tudo funciona bem.

Devo zipar meu array serializado antes de colocá-lo no banco de dados? Alguma outra solução?

Muito obrigado pela ajuda!

    
por Kaaviar 08.06.2012 / 13:35

1 resposta

6

$wpdb não é adequado para buscar uma quantidade enorme de dados do banco de dados. Por quê? No seu caso:

  1. $wpdb->get_results( ... ) - busca todos os resultados em sua RAM de uma só vez. Isso significa que se você tiver 4mb, 10mb ou 50mb de dados em db, tudo será armazenado na memória (o que é limitado como você sabe).
  2. $wpdb->get_results( ..., ARRAY_A ) - $wpdb obtém tudo como objeto por padrão e, se você passar ARRAY_A , ele converterá uma matriz de objetos em uma matriz de matrizes associadas. Isso significa que, se você já tiver coletado 4mb / 10mb / 50mb de dados na memória, será necessário multiplicá-los 2 ou mais vezes.

Então, suponho que seu problema esteja atingindo o limite de memória do seu script. É por isso que funciona para um resultado e não funciona para todos os resultados. Há uma solução alternativa para esse problema: use a função mysql_* da maneira que você precisa:

$result = @mysql_query( "SELECT item, datas FROM trading_datas", $wpdb->dbh );
if ( $result ) {
    while ( ( $row = @mysql_fetch_array( $result, MYSQL_ASSOC ) ) ) {
        // do stuff here for each result ...
    }
    @mysql_free_result( $result );
}
    
por Eugene Manuilov 08.06.2012 / 13:51

Tags