web-dev-qa-db-fra.com

get_results sur de grands ensembles de données

J'expérimente un problème très dérangeant en utilisant une requête SQL personnalisée. J'ai une table MySQL personnalisée appelée trading_datas ayant 165 lignes pour 4,4Mo. Un champ datas de ma table est un grand tableau sérialisé.

Lorsque vous demandez cela de cette façon:

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

mon script PHP s'arrête et rien ne se répercute juste après cette ligne. Lorsque vous ne récupérez que item, tout fonctionne parfaitement.

Devrais-je compresser mon tableau sérialisé avant de le placer dans la base de données? Une autre solution?

Merci beaucoup pour l'aide!

6
Kaaviar

$wpdb ne convient pas pour extraire une énorme quantité de données de la base de données. Pourquoi? Dans ton cas:

  1. $wpdb->get_results( ... ) - récupère tous les résultats dans votre RAM à la fois. Cela signifie que si vous avez 4 Mo, 10 Mo ou 50 Mo de données en db, tout sera stocké en mémoire (ce qui est limité, comme vous le savez).
  2. $wpdb->get_results( ..., ARRAY_A ) - $wpdb récupère tout en tant qu'objet par défaut, puis si vous passez ARRAY_A, il convertira un tableau d'objets en un tableau de tableaux associés. Cela signifie que si vous avez déjà récupéré le 4mb/10mb/50mb de données en mémoire, vous devez le multiplier 2 ou plus.

Donc, je suppose que votre problème est d’atteindre la limite de mémoire par votre script. C'est pourquoi cela fonctionne pour un résultat et ne fonctionne pas pour tous les résultats. Il existe une solution de contournement à ce problème - utilisez la fonction mysql_* de la manière dont vous en avez besoin:

$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 );
}
6
Eugene Manuilov