Próbuję dowiedzieć się, w jaki sposób PHP ładuje tablice do pamięci i kiedy przekazywanie tablicy zużywa pamięć.Jak działa zarządzanie wykorzystaniem pamięci macierzy PHP?
Więc mam ten mały kawałek kodu z rzędu: zauważ, że tablica wejście jest mniej ważny w tym przykładzie:
<?php
echo $this->getMemoryUsage();
$arr = $query->result_array(); // array of arrays from codeigniter
echo $this->getMemoryUsage();
ten zużywa dokładnie 250 kB pamięci, oznacza to, że tablica jest w przybliżeniu 250 kB w rozmiarze, około.
Więc wpadłem następujący kod:
<?php
echo $this->getMemoryUsage();
$arr = $query->result_array(); // array of arrays from codeigniter
$arr[0]['id'] = 'changing this value';
$foo = $arr;
$foo[2]['id'] = 'changing this value again';
$bar = $foo;
$bar[4]['id'] = 'changing this value again and again';
$far = $bar;
$far[5]['id'] = 'changing this value again and again and again';
echo $this->getMemoryUsage();
Według tego, co czytałem i powiedziano mi, PHP nie faktycznie skopiować tablicę, tylko odwołuje się do oryginalnej tablicy, ale raz zmiana jest wykonane PHP musi skopiować całą tablicę.
Wyobraźcie sobie moje zdziwienie, gdy powyższy kod zużywa dokładnie 500 KB pamięci RAM.
Czy ktoś może wyjaśnić, co tu się dzieje?
Dla jasności wszystkie te indeksy (0-5 i id
) już istnieją w oryginalnej tablicy, po prostu modyfikuję wartość. Oryginalna wartość jest liczbą całkowitą.
EDIT
Wystarczy wyczyścić zaangażowania $ this-> wynik(); Oto kolejny test mam przeprowadzać:
echo $this->getMemoryUsage();
$arr = $query->result_array(); // array of arrays from codeigniter
//$arr[0]['id'] = 'changing this value';
$foo = $arr;
$foo[2]['id'] = 'changing this value again';
//$bar = $foo;
//$bar[4]['id'] = 'changing this value again and again';
//
//$far = $bar;
//$far[4]['id'] = 'changing this value again and again and again';
echo $this->getMemoryUsage();
Tym razem wynik jest dokładnie 250 kB - Podobnie jak w pierwotnym badaniu bez jakichkolwiek zmian
EDIT # 2
Zgodnie z życzeniem, ja” Wcześniej prowadził kod tutaj na mojej konfiguracji, aby upewnić się, że wyniki są zgodne: http://pastebin.com/cYNg4cg7
są to wyniki:
OŚWIADCZENIE: 4608 kB
KOŃCOWA: 8904 kB
DIFF deklarację: 4296 kB
Więc nawet jeśli zgłoszenie było 4608 i tablica została uchwalona i zmienił się 4 razy, to wciąż tylko mniej niż podwojona pamięć ślad stopy.
EDIT # 3
ja prowadził zmiany pamięci po każdej alokacji:
deklarację: 5144 kB
rozdysponowania A0 dodania: 144 kB
przydzielania A1 dodania: 1768 kB
przydział dodanego A2: 1768 kB
przydzielenie A3 dodane: 1768 kB
FINAŁ: 10744 kB
DIFF DO DEKLARACJI: 5600 kB
Każda następna operacja po pierwszym koszcie jest dokładnie taka sama, co wydaje się wskazywać dokładnie ten sam rozmiar, który jest kopiowany. Wydaje się, że to wspiera odpowiedź Austina. Jedyną rzeczą, która się nie sumuje, jest rozmiar przydzielony, ale to inne pytanie.
Wygląda na to, że Austin jest na piłce, przyjmuję to, jeśli nie przyjdzie żadna inna odpowiedź.
Bardzo trudne pytanie, może być zainteresowany w następującym artykule przeczytałem kilka dni temu: https: // Nikić .github.io/2011/12/12/How-big-are-PHP-arrays-really-Hint-BIG.html – Fleshgrinder
Przeczytałem ten artykuł kilka tygodni temu, to szczerze mówiąc n, ale nie wyjaśnia, jak dokładnie działa kopiowanie. – Patrick
Wiem, pomyślałem, że ci się spodoba. Nie mogę odpowiedzieć na twoje pytanie i nie mogę podać linku, który mógłby odpowiedzieć na twoje pytanie. Zamiast tego zagrałem w Twoje pytanie, aby móc je śledzić i przyznać nagrodę, jeśli nie udzielono odpowiedzi, ponieważ bardzo chciałbym to wiedzieć. :) – Fleshgrinder