web-dev-qa-db-ja.com

PHPでオブジェクトのメモリ内のサイズを取得していますか?

合計メモリを取得する方法がありますPHPは(memory_get_usage())を使用していますが、個々のオブジェクトのメモリ内のサイズをどのように取得しますか?

潜在的に複雑なデータ構造のバイト数が必要なため、count()については明らかに話していません。

29

このIBMの例 に示すように、クラスを割り当てる前後にmemory_get_usage()を呼び出すことができます。これを行うラッパーを作成して、結果を複合クラス自体のメンバー変数に格納することもできます。

編集:

割り当てられたメモリサイズの格納に関する部分を明確にするには、次のようにします。

class MyBigClass
{
    var $allocatedSize;
    var $allMyOtherStuff;
}

function AllocateMyBigClass()
{
    $before = memory_get_usage();
    $ret = new MyBigClass;
    $after = memory_get_usage();
    $ret->allocatedSize = ($after - $before);

    return $ret;
}

将来の任意の時点で、allocatedSizeをチェックして、割り当て時のオブジェクトの大きさを確認できます。ただし、割り当て後に追加すると、allocatedSizeは正確でなくなります。

17
Eric J.

オブジェクトをシリアル化して文字列の長さを読み取ろうとしても意味がありませんか?当然、シリアライズされた文字列はs: 'string'であるため、数バイトはオフになります。したがって、s: ''は余分なバイトです... PHPがオブジェクトを格納するのと同じ方法でない限り、

だから例えば

$size = strlen(serialize($object));

ちょっとした考え?

別の厄介ですが、おそらく正確な考え:

インスタンス化以降、数回操作されたクラスインスタンス変数を想定します。

$DB; // database access class for eg.
$mem = memory_get_usage();
$DB_tmp = clone $DB;
$mem = memory_get_usage() - $mem;
unset($DB_tmp);

$ memは、$ DBに割り当てられたメモリの正確な量です。

12
Prof83

これはかなり可能だとは思いません。メモリ内のオブジェクトのサイズを取得できるものを見たことはありません。

かなりおおざっぱなアイデアを得るには、データをシリアル化してstrlenを使用するという方法が考えられます...しかし、それは実際には見積もりの​​ようなものです。 ..


偶数 debug_zval_dump はそれを行いません:変数とrefcountにデータを出力しますが、使用されたメモリは出力しません:

$obj = new stdClass();
$obj->a = 152;
$obj->b = 'test';

echo '<pre>';
debug_zval_dump($obj);
echo '</pre>';

あなただけを取得します:

object(stdClass)#1 (2) refcount(2){
  ["a"]=>
  long(152) refcount(1)
  ["b"]=>
  string(4) "test" refcount(1)
}
3
Pascal MARTIN

cloneProf83の回答 から)が機能しなかったため、サイズがIの変数をシリアル化およびシリアル化解除しようとしました測定したい:

function getMemoryUsage($var) {
    $mem = memory_get_usage();
    $tmp = unserialize(serialize($var));
    // Return the unserialized memory usage
    return memory_get_usage() - $mem;
}

少なくとも私にとっては、より良い結果を報告すると思います。

1
Iván Pérez