web-dev-qa-db-ja.com

大規模データセットのget_results

カスタムSQLクエリを使用して、非常に厄介な問題を実験しています。私はtrading_datasというカスタムMySQLテーブルを持っていて、4,4Moのために165行あります。私のテーブルの1つのフィールドdatasは大きな直列化配列です。

そのようにそれを要求するとき:

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

my PHPスクリプトが停止し、その行の直後に何もエコーされません。 itemだけを検索するとき、すべてがうまくいきます。

データベースに配置する前に、シリアル化した配列をZip圧縮する必要がありますか?他の解決策はありますか?

助けてくれてありがとう!

6
Kaaviar

$wpdbはデータベースから大量のデータを取得するのには適していません。どうして?あなたの場合:

  1. $wpdb->get_results( ... ) - すべての結果を一度にRAMにフェッチします。つまり、dbに4MB、10MB、または50MBのデータがある場合、すべてがメモリに格納されます(ご存知のように制限されています)。
  2. $wpdb->get_results( ..., ARRAY_A ) - $wpdbは、デフォルトですべてをオブジェクトとして取得します。そして、ARRAY_Aを渡すと、オブジェクトの配列を関連する配列の配列に変換します。つまり、すでに4mb/10mb/50mbというデータをメモリにフェッチしている場合は、2回以上乗算する必要があります。

だから、私はあなたの問題はあなたのスクリプトによってメモリ制限に達することにあると思います。それが1つの結果に対して機能し、すべての結果に対して機能するわけではない理由です。この問題には1つの回避策があります - 必要に応じてmysql_*関数を使用してください。

$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