Sto cercando di capire come PHP carica gli array in memoria e quando passa un array consuma memoria.Come funziona la gestione dell'utilizzo della memoria dell'array di PHP?
Così ho questa piccola porzione di codice in esecuzione: Si noti che la matrice di ingresso è meno importante in questo esempio:
<?php
echo $this->getMemoryUsage();
$arr = $query->result_array(); // array of arrays from codeigniter
echo $this->getMemoryUsage();
Questo consuma esattamente 250 KB di memoria, questo significa che la matrice è di circa 250 kB in dimensione, approssimativamente.
così mi sono imbattuto il seguente codice:
<?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();
Secondo quello che ho letto e mi fu detto, PHP in realtà non copia l'array, fa riferimento solo la matrice originale, ma una volta un cambiamento è reso PHP deve copiare l'intero array.
Immaginate la mia sorpresa quando il codice precedente consuma esattamente 500 kB di RAM.
Qualcuno può spiegare cosa sta succedendo qui?
Giusto per essere chiari, tutti questi indici (0-5 e id
) esistono già nell'array originale, sto solo modificando il valore. Il valore originale è un numero intero.
EDIT
Proprio per cancellare il coinvolgimento di $ this-> risultato(); Qui è un altro test che ho condotto:
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();
Questa volta l'uscita è esattamente 250 kB - Proprio come il processo originale senza alcuna modifica
EDIT # 2
Come richiesto, ho' ve correva il codice da qui in poi la mia messa a punto, per assicurarsi che i risultati sono coerenti: http://pastebin.com/cYNg4cg7
Questi sono i risultati:
012.351.641,061 milaDICHIARAZIONE: 4608 kB
FINALE: 8904 kB
DIFF ALLA DICHIARAZIONE: 4296 kB
Così, anche se la dichiarazione era 4608 e la matrice è stata approvata e ha cambiato 4 volte, è ancora solo meno che raddoppiato la memoria orma.
EDIT # 3
Ho ho fatto funzionare i cambiamenti di memoria dopo ogni attribuzione:
DICHIARAZIONE: 5144 kB
assegnazione A0 aggiunto: 144 kB
assegnazione A1 ha aggiunto: 1768 kB
A2 allocazione aggiunta: 1768 kB
allocazione A3 aggiunto: 1768 kB
FINALE: 10744 kB
DIFFILE DICHIARAZIONE: 5600 kB
Ogni operazione successiva alla prima costa esattamente la stessa cosa, che sembra indicare che la stessa esatta dimensione viene copiata. Questo sembra supportare la risposta di Austin, L'unica cosa che non si aggiunge ora è la dimensione che è stata assegnata, ma questa è una domanda diversa.
Sembra che Austin sia sulla palla, lo accetterò se non arriva altra risposta.
domanda molto difficile, si può essere interessato al seguente articolo che ho letto qualche giorno fa: https: // Nikic .github.io/2011/12/12/How-big-are-PHP-array-really-Hint-BIG-I.html – Fleshgrinder
Ho letto quell'articolo alcune settimane fa, È onestamente fasci nating, ma non spiega come funziona esattamente la copia. – Patrick
Lo so, ho pensato che ti sarebbe piaciuto. Non posso rispondere alla tua domanda e non posso fornirti un link che possa rispondere alla tua domanda. Invece ho recitato la tua domanda in modo da poterla seguire e darle una taglia se non viene pubblicata alcuna risposta, dal momento che mi piacerebbe anche saperlo. :) – Fleshgrinder