オーバーヘッドを回避するために直接を使用Laravel 8
してMySQL 8
テーブルに対してクエリを実行するために使用しますが、とにかく多くのメモリを消費しています。例を示すために、次のクエリを実行して、正確に300000個の要素を選択します。query builder
Eloquent
私のコードは次のようになります:
$before = memory_get_usage();
$q_coords = DB::table('coords')->selectRaw('alt, lat, lng, id')
->where('active', 1)->take(300000)->get();
$after = memory_get_usage();
echo ($after - $before);
169760384と表示されます。これは、間違えない限り169MBのようなものを意味します。
クエリで4 x 8バイト(32バイト)のようなものを表す2つのfloatと2つのbigIntのみを要求したため、私には多くのように見えます。
そして..32x 300 000レコード〜= 9600000(ほぼ10MB)。
どうしてそんなに多くのメモリを使うことができるのでしょうか?びっくりしました。
私もPDO
直接使ってみましたが、同じ結果です。
$query = DB::connection()->getPdo()->query("select alt, lat, lng, id from coords WHERE active = 1 LIMIT 300000");
$q_coords = $query->fetchAll();
PHPでは、各変数は特定のデータ構造で処理されdynamic typing
、garbage collection
などを許可します。
ここで(かなり古いがまだ問題ない)記事を見ることができます:リンク
また、たとえば文字列と見なされる配列キーを格納するためにバケットが必要なため、配列にはより具体的な処理があることがわかります。
つまり、(記事によると)配列の要素を格納するために使用されるデータは約144バイトあるということです。
さて、私はあなたの結果を正確に説明することはできませんが、あなたの場合は次のようなものがあると言うことができます:
300 000 * 144 * 4 = 172 800 000
どの意味300000行の4つの変数と144バイトの変数で。
ご覧のとおり、PHP 7で行われた改善やその他の要因を計算で考慮していなくても、得られたものからそれほど遠くはありません...
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加