0

PHP に関するいくつかの興味深いメモリの問題に出くわしました。このコードを検討してください (sql-result は約 18000 行です)。

echo memory_get_usage() . PHP_EOL;

echo 'Querying mysql' . PHP_EOL;
$result = $wpdb->get_results($sql);

echo memory_get_usage() . PHP_EOL;

echo PHP_EOL;
echo 'Size of result set' . PHP_EOL;
echo strlen(serialize($result)) . PHP_EOL;

出力:

33309232
Querying mysql
86203976

Size of result set
6838278

メモリ使用量がこのようにピークに達するのはなぜですか? ちょっとおかしくないですか?

おそらく最も重要な質問ですが、使用量を減らすために何かできることはありますか?

4

2 に答える 2

0

データベースの各行はオブジェクト/ハッシュにパッケージ化され、各値はハッシュ キーと値自体を取得するため、多くのオーバーヘッドが発生します。

オーバーヘッドを減らすためにできること: 1) 本当に必要な列だけを選択してください。select *

2) get_results()返されるものを制御するために使用する2番目のパラメーターがあります。を使用するARRAY_Nと、配列の配列として結果が得られます。これにより、オーバーヘッドが最小になります。

wpdb#SELECT_Generic_Results

3) これで十分でない場合は、たとえば 1000 行のバッチでデータを取得する必要があります。これには sql 修飾子offsetを使用できますlimit

于 2012-06-14T11:06:40.917 に答える
0

xdebug を使用した基本的なプロファイリングのみが、実際のメモリ使用量を特定できます。

プロファイリングせず、大胆な推測を行うと、複数のオプションがあります。

  • 結果をページ分割します。つまり、1 つの大きなクエリではなく複数のクエリを送信します。
  • の出力形式としてARRAY_Nを使用し$wpdb->get_results($sql, ARRAY_N)、軽量でコンパクトな形式

ボーナス(マイヤーが言ったように):SELECT句のすべてのフィールドが必要であることを確認し、必要がないことを確認してくださいselect *

お役に立てれば !

于 2012-06-14T11:27:25.847 に答える