Concommation mémoire variables php

Concommation mémoire variables php - PHP - Programmation

Marsh Posté le 13-02-2016 à 10:58:51    

Salut à tous,

 

J'ai développé un algo en php qui permet de faire des calculs mathématiques. Sans rentrer dans le détail, l'algo génère des millions de variables en array(). Ces variables sont des entiers.
Au final, l'algo alimente un fichier texte avec les résultats (60mo de texte, de nombres entiers à la suite).
Mais le souci c'est que ces millions de variables consomment à mort la mémoire vive et je plafonne rapidement à 16go (la RAM totale de mon PC) du coup après ça swap sur le disque dur et ça ralenti beaucoup le script.

 

Je suis étonné que des variables (qui ne sont que des séries de nombres), même si elles sont très nombreuses, consomment 16Go de RAM ...

 

Y a t il un moyen de diminuer cette consommation (outre le fait de modifier l'algo, car je suis déjà en train de réfléchir à ça et j'ai déjà pas mal optimisé mais je ne peux pas me passer de ces millions de variables générés, qui sont au coeur du système). En fait j'ai plutôt 1 seule variable mais en array(), qui comporte des millions de lignes. $var[0], $var[1], $var[2], $var[3], etc ... jusqu'à $var[quelques millions]. En fait, dès que je dépasse $var[20 000 000], ça commence à swaper sur le hdd.

 

Et si je change de langage pour cet algo, je peux remédier à ça ? Si oui, quel langage serait le mieux ?

 

Merci d'avance pour votre aide.


Message édité par zbineulongtime le 13-02-2016 à 11:02:16
Reply

Marsh Posté le 13-02-2016 à 10:58:51   

Reply

Marsh Posté le 15-02-2016 à 03:23:12    

Je pense que le Web n'est pas vraiment adapté à ton objectif. Mieux vaux passer en client lourd. Regarde du coté du C/C++ ou du Java.


Message édité par DieuX le 15-02-2016 à 03:23:36
Reply

Marsh Posté le 15-02-2016 à 11:05:27    

Quand j'ai besoin de faire de gros calculs en PHP, j'emploie l'une de ces 2 solutions :
1) calculs faits dans une BD (Mysql, dans mon cas). C'est bien adapté pour du calcul matriciel ou du calcul à appliquer sur un ensemble de données (stats, par ex).
 
2) quand ça suffit pas la BD, je fais un stockage des données en BD, extraction en CSV, importation de ce CSV dans un programme exe écrit en C/C++ qui fait les calculs puis stockage du résultat dans un CSV et import dans la BD.
 
Pour un gros calcul matriciel de X * tX (matrice X multiplié par sa transposée), je suis passé d'un temps de calcul de plusieurs heures en PHP (une matrice d'environ 5000x5000), à 20 min environ avec MySQL  et à 3 Min avec l'exe. ;)
 
Après, pour les très gros volumes de données, y'a les BD de type NoSQL qui sont adaptées.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 15-02-2016 à 16:22:55    

Pourquoi importer et exporter en CSV ? Pourquoi ne pas directement accéder à la base de donnée ?
 
Après pour des enregistrements de beaucoup de donnée Oracle doit être pas mal dans ce genre, très axé à la gestion de BDD immense !

Reply

Marsh Posté le 15-02-2016 à 16:53:23    

L'import/export, c'est dans le cas où ça poserait un soucis au programme écrit en C/C++ de se connecter en direct à la BD.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 16-02-2016 à 13:45:31    

J'ai déjà testé en utilisant une bdd mysql, mon script tourne beaucoup trop lentement.
Je vais donc du coup essayer ça en C++. Mais je connais pas trop ce langage :/

Reply

Marsh Posté le 17-02-2016 à 10:48:22    

T'as bien fait gaffe à mettre les indexes sur les bons champs ? Car ça peut grandement changer la donne.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 17-02-2016 à 13:44:53    

rufo a écrit :

T'as bien fait gaffe à mettre les indexes sur les bons champs ? Car ça peut grandement changer la donne.


 
Tu m'intéresses, tu peux m'en dire + ? :)
 

Reply

Marsh Posté le 17-02-2016 à 14:16:36    

20 000 000 d'entiers, sauf erreur de calcul ça devrait bouffer 160 Mo en mémoire environ (en prenant des ints sur 64 bits), donc si ça t'en bouffe 100 fois plus, c'est sur qu'il y a un pb. Bon, s'il y a du BigNum ou du GMP par contre, ça doit effectivement bouffer plus de mémoire.
 
Dans un premier temps, j'essaierais juste de reprendre le code php, et en faire du perl (ça devrait être très transparent, puisque PHP a repris une grosse partie de sa syntaxe et de ses librairies de perl) et voir si le pb persiste.
 
Si oui, il y a alors surement des choses à revoir dans l'algorithmique.
 
A+,


Message édité par gilou le 17-02-2016 à 14:21:12

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 17-02-2016 à 17:21:18    

zbineulongtime a écrit :


 
Tu m'intéresses, tu peux m'en dire + ? :)
 


En fonction des colonnes sur lesquelles t'as positionné des indexes, ça peut soit accélérer le calcul, soit le ralentir. Pour certains calculs, il m'est déjà arrivé d'avoir un rapport de x10 suivant la manière dont je positionnais les indexes. Mais là, faut faire des tests, chaque cas est spécifique car dépend des données et des traitements effectués dessus.
 
Tu peux aussi tuner le fichier de conf de MySql pour augmenter la taille de certains caches.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 17-02-2016 à 17:21:18   

Reply

Marsh Posté le 17-02-2016 à 21:02:13    

Merci pour vos précieux conseils qui m'aident à avancer. Je viens de passer en code en perl et je divise par 25 ma consommation de mémoire par rapport à php !! Je vais voir jusqu'où je peux aller dans mon calcul avec mes 16Go de RAM et je vous dis ce que ça donne :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed