FriendsOfREDAXO / cache_warmup

Generiert den Cache vorab, so dass die Website bereits beim Erstaufruf performant läuft
MIT License
41 stars 2 forks source link

Mit keys statt values arbeiten um den speicherbedarf zu reduzieren #37

Closed staabm closed 7 years ago

staabm commented 7 years ago

aktuell arbeiten wir in https://github.com/FriendsOfREDAXO/cache_warmup/blob/master/lib/selector.php mit einem array was gefüllt wird und am ende mittels array_unique() duplikate entfernt werden.

array_unique auf große arrays ist speicheritensiv.

-> anstatt die array values zu füllen könnte man auch mit keys arbeiten, da sich diese autom. überschreiben und so erst gar keine duplikate entstehen. Ob es was bringt muss man natürlich ausprobieren ;-).

IST-Beispiel (https://3v4l.org/JeUEg):

$images = array();
$images[] = 'bild1.jpeg';
$images[] = 'bild1.jpeg';
$images[] = 'bild1.jpeg';
$images = array_unique($images);
var_dump($images); // -> array('bild1.jpg');

Vorschlag-Beispiel (https://3v4l.org/JMRcJ):

$images = array();
$images['bild1.jpeg'] = 1;
$images['bild1.jpeg'] = 1;
$images['bild1.jpeg'] = 1;
$images = array_keys($images);
var_dump($images); // -> array('bild1.jpg');
schuer commented 7 years ago

Gerade mal einen Test mit array_unique auf der Website gemacht, auf der der Speicherüberlauf passiert ist.

Items: 8481 Items nach array_unique: 1341 Speicher verbraucht: 528440 bytes

Ist jetzt nicht so wild, oder? Sollten wir den Code wie von @staabm beschrieben anpassen oder lieber so lassen?

schuer commented 7 years ago

Oh, spannend: Wenn man hingegen den kompletten Flow trackt, also vom Beginn aller Queries über das Befüllen des Arrays und der späteren Filterung, ist der Speicherverbrauch etwa so:

Vorher: ~5 MB Nachher: ~1,8 MB

Das spricht deutlich für Markus’ Anpassung, was? Vor allem, weil sie blitzschnell gemacht ist.

schuer commented 7 years ago

Sorry, doch nicht. Hatte versehentlich die Prüfungen auf $media->isImage() ausgeklammert, und das war leider der wesentliche Faktor, der den Speicher so sehr reduziert hat. Kommt die Prüfung wieder rein, ergibt sich leider kein merklicher Unterschied zwischen der Vorher-Variante und der Nachher-Variante. Beide benötigen ~5 MB.

schuer commented 7 years ago

Entschuldigt bitte, dass ich mir hier einen Wolf schreibe, aber: Verwirft man die Mediainstanz nach jeder Prüfung mittels rex_media::clearInstance($item);, schrumpft der Speicherverbrauch in beiden Varianten auf besagte ~1,8 MB. 🎉

(Siehe Kommentar von @gharlan in https://github.com/FriendsOfREDAXO/cache_warmup/commit/541f1daa04e07d82e98cc5ee5526f269f162cdd6#commitcomment-20528983)

staabm commented 7 years ago

Dann weg mit den instanzen :-)

staabm commented 7 years ago

Sobald wir erstmal an einem punkte sind wo es für große installation gut funktioniert brauch man ja nicht dann jede kleinigkeit ändern.

Wg instance pool wuerd ich noch reinmachen und sonst nur wirklich gut messbares

schuer commented 7 years ago

Finde ich auch. Instanzen kommen morgen rein und dann gibt’s ein neues Release.

schuer commented 7 years ago

WONTFIX, hat aber viele Erkenntnisse gebracht. Danke! :)