2009-08-29 27 views

Respuesta

15

Puede llamar a memory_get_usage() antes y después de asignar su clase como se ilustra en this example from IBM. Incluso puede crear un contenedor para hacer esto, posiblemente almacenando el resultado en una variable miembro de la clase compleja en sí.

EDIT:

Para aclarar la parte de almacenamiento del tamaño de la memoria asignada, puede hacer algo como esto:

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; 
} 

En cualquier momento en el futuro, se puede comprobar allocatedSize para ver qué tan grande ese objeto estaba en el momento de la asignación. Sin embargo, si lo agrega después de asignarlo, assignedSize ya no será preciso.

+1

¿Qué pasa si PHP decide liberar la memoria que se mantuvo asignada, solo en el "momento equivocado"? Realmente no sé cuándo PHP libera memoria (tipo de "cuando sea necesario", supongo), pero supongo que esta liberación podría traer algunos problemas. ¿Especialmente con el recolector de basura introducido por PHP 5.3 para referencias cíclicas? –

+0

Bueno, sí, pero además de lo que mencionó Pascal, quiero ser capaz de descubrir esto en diferentes momentos, no solo en el momento de la asignación. Quiero descubrir esto muchas líneas en el camino. –

+0

@Pascal: PHP no liberará la memoria que todavía hace referencia a un objeto que se está utilizando activamente. Las referencias cíclicas significan A referencias B y B hacen referencia a A, pero ninguna otra cosa hace referencia a A o B. Por lo tanto, la memoria no se liberará mientras el programa aún pueda hacer referencia a ella de cualquier manera. –

3

No creo que esto sea posible; Nunca he visto nada que te permita obtener el tamaño de un objeto en la memoria.

Una solución para obtener una idea bastante aproximada podría ser serializar sus datos, y usar strlen en eso ... Pero eso realmente será una especie de estimación ... No confiaría mucho en algo como que, en realidad ...


Incluso debug_zval_dump no hace eso: ouput los datos de una variable y el refcount, pero no la memoria utilizada:

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

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

sólo va a llegar:

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

Muy interesante. Mi siguiente pregunta fue acerca de obtener refunciones para descubrir por qué hay una pérdida de memoria. ¡Gracias! –

11

¿No tendría sentido intentar serializar el objeto y leer la longitud de la cadena? Obviamente, estará varios bytes desactivados porque la cadena serializada tendría s: 'string' por lo tanto s: '' son bytes adicionales ... a menos que serialize podría ser de la misma manera que PHP almacena objetos ???

así por ejemplo

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

Es sólo una idea?

Otra desordenado, pero posiblemente precisa pensamiento:

Suponiendo una variable de instancia de clase que ha sido manipulado unas cuantas veces desde instancias:

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

$ mem podría ser la cantidad exacta de memoria asignada a $ DB ;

+0

** clon ** no funciona para mí (no sé por qué). Siempre informa 100 bytes después de clonar un objeto. –

1

Desde clon (de Prof83's answer) no funcionó para mí, traté de serializar y serializar la variable cuyo tamaño Quiero medir:

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

Creo que reporta mejores resultados, al menos para mi.

+0

no usaste la variable '$ tmp' –

0

Si solo quiere saber el tamaño del objeto, y no para su próximo código, return en el navegador, y puede ver cuánto transmite la red el objeto.

Cuestiones relacionadas