How big are PHP arrays (and values) really? (Hint: BIG!)

il y a 2 ans Suivre (1) · Utile · Commenter

Upfront I want to thank Johannes and Tyrael for their help in finding some of the more hidden memory usage.


In this post I want to investigate the memory usage of PHP arrays (and values in general) using the following script as an example, which creates 100000 unique integer array elements and measures the resulting memory usage:


<?php
$startMemory = memory_get_usage();
$array = range(1, 100000);
echo memory_get_usage() - $startMemory, ' bytes';


How much would you expect it to be? Simple, one integer is 8 bytes (on a 64 bit unix machine and using the long type) and you got 100000 integers, so you obviously will need 800000 bytes. That’s something like 0.76 MBs.

Now try and run the above code. You can do it online if you want. This gives me 14649024 bytes.


Yes, you heard right, that’s 13.97 MB - eightteen times more than we estimated.


So, where does that extra factor of 18 come from?

il y a 2 ans Suivre (1) · Utile · Commenter

4 commentaires

akhenathon
Auteur caché il y a 2 ans

une version plus optimisée des arrays est proposée par : http://php.net/manual/fr/class.splfixedarray.php

dam75
Auteur caché il y a 2 ans

Merci :)


De ce que j'en avais testé, l'intérêt de splFixedArray réside dans l'occupation mémoire (60% de moins que les array classiques) et dans l'optimisation du remplissage SI le tableau fait plus de 1000 éléments (en dessous un array classique est plus rapide) ... 

Par contre en parcours (foreach, ...), pas de différence notable :( ... mais bon 60% de mémoire en moins c'est toujours ça de pris :)

A noter enfin pour ceusses qui veulent l'utiliser : c'est un object qui implémente des interfaces qui le "font" ressembler à un array (Iterator, ArrayAccess, Countable, ...) mais ce n'est quand même pas un array vu par le langage.
==> Les bonnes vieilles fonctions de manipulation de tableau natives de PHP (in_array, array_push, implode, array_nimporte_quoi, ...) ne fonctionnent pas :)

Une page avec quelques benchs  :

akhenathon
Auteur caché il y a 24 mois

Merci pour les benchs - a priori en écriture il est un peu plus performant aussi.

Je viens de tomber sur cet article qui parle des manipulations array_* et des différents avantages des classes SPL :
http://fr.slideshare.net/patrick.allaert/maitriser-les-structures-de-donnes-php-102-forum-paris-2012

La super bonne nouvelle c'est que dans PHP 5.4 une classe sera moins lourde qu'un array ...

akhenathon
Auteur caché il y a 23 mois

Je viens de tomber sur cette extension :
http://www.php.net/manual/fr/book.judy.php

Un bench tend à montrer qu'il est encore moins gourmand en mémoire :
http://rusty.ozlabs.org/?p=153

Close

Connexion à Expeert

Connexion à Expeert
 
Inscription
Close

Voulez-vous utiliser la version mobile ?

Close

Au sujet des invitations

Expeert est actuellement uniquement disponible sur invitation. Si vous en avez reçu une vous devez disposer d'un mail contenant un lien qui vous permettra de créer votre compte.
Close

Demander une invitation

Si vous désirez être tenu au courant de l'ouverture d'Expeert, laissez nous votre email ici :