2009-07-02 13 views

Odpowiedz

40

Można użyć memory_get_usage().

Wykonaj jeden raz przed utworzeniem obiektu, a następnie ponownie po utworzeniu obiektu i wybierz różnicę między dwoma wynikami.

+2

Innym sposobem na zrobienie tego w pamięci jest pobierz pamięć, sklonuj obiekt, pobierz nowe użycie pamięci i usuń klon. Istnieje jednak ślad, więc nie nadużywaj ... :) –

+0

Wierzę, że wynik, który otrzymujemy z 'echo memory_get_usage()' przed i po tablicy, jego jednostki przypuszczają być w 'KB' !! ! Podzielam rozmiar pamięci na 1024! Aby uzyskać rzeczywisty zużyty rozmiar pamięci. – Neocortex

+2

nie jest w bajtach nie kb http://ca3.php.net/memory_get_usage –

-6

Nie wiem, że istnieje prosty sposób na uzyskanie rozmiaru obiektu w PHP. Może po prostu trzeba zrobić algorith że

  1. zlicza ints
  2. liczba Mnoży o wskazówki o wielkości int na dysku twardym
  3. Konwersja znaków w ciągach ASCII i
  4. pomnożyć wartości ASCII przez ile one zajmują na dysku

Jestem pewien, że jest lepszy sposób, ale to by działało, nawet gdyby to był ból.

+4

TO było szalone. ;] –

+14

Nie pamiętasz, aby poczekać 1 kwietnia, aby opublikować ten jeden kumpel! – NickT

+0

Nie sądzę, że był poważny :) – Stann

10

Aby zorientować się o wielkości obiektów, spróbuj

strlen(serialize($object)); 

To bynajmniej nie jest dokładna, ale łatwym sposobem, aby uzyskać numer do porównania.

+1

To może mieć kilka zastosowań, ale nie dla pamięci. PHP <= 5,2 jest głęboko nieefektywne w sposobie przechowywania pewnych struktur pamięci. – danorton

+0

Używałem tego do sprawdzenia odpowiedzi jsona przed wysłaniem, ale to faktycznie wyczerpuje mój limit pamięci – clod986

8

Jeśli potrzebujesz znać rozmiar już utworzonego obiektu lub macierzy, możesz użyć poniższego kodu, aby go znaleźć.

<?php 

function rec_copy($src) { 
    if (is_string($src)) { 
    return str_replace('SOME_NEVER_OCCURING_VALUE_145645645734534523', 'XYZ', $src); 
    } 

    if (is_numeric($src)) { 
    return ($src + 0); 
    } 

    if (is_bool($src)) { 
    return ($src?TRUE:FALSE); 
    } 
    if (is_null($src)) { 
    return NULL; 
    } 

    if (is_object($src)) { 
    $new = (object) array(); 
    foreach ($src as $key => $val) { 
     $new->$key = rec_copy($val); 
    } 
    return $new; 
    } 

    if (!is_array($src)) { 
    print_r(gettype($src) . "\n"); 
    return $src; 
    } 

    $new = array(); 

    foreach ($src as $key => $val) { 
    $new[$key] = rec_copy($val); 
    } 
    return $new; 
} 

$old = memory_get_usage(); 
$dummy = rec_copy($src); 
$mem = memory_get_usage(); 

$size = abs($mem - $old); 
?> 

To w istocie tworzy kopię struktury tablicy i wszystkich jej członków.

nie 100%, ale nadal działa wersja jest również:

<?php 

$old = memory_get_usage(); 
$dummy = unserialize(serialize($src)); 
$mem = memory_get_usage(); 

$size = abs($mem - $old); 

nadzieję, że pomoże w przypadkach, gdy obiekt jest już budować.

Powiązane problemy