Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
1554 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Concommation mémoire variables php

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Concommation mémoire variables php

n°2275578
zbineulong​time
☱☱☱☱☱☱☱☱☱☱☱☱
Posté le 13-02-2016 à 10:58:51  profilanswer
 

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
mood
Publicité
Posté le 13-02-2016 à 10:58:51  profilanswer
 

n°2275671
DieuX
Posté le 15-02-2016 à 03:23:12  profilanswer
 

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
n°2275677
rufo
Pas me confondre avec Lycos!
Posté le 15-02-2016 à 11:05:27  profilanswer
 

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 Cantine Calandreta : http://sourceforge.net/projects/canteen-calandreta
n°2275723
DieuX
Posté le 15-02-2016 à 16:22:55  profilanswer
 

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 !

n°2275724
rufo
Pas me confondre avec Lycos!
Posté le 15-02-2016 à 16:53:23  profilanswer
 

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 Cantine Calandreta : http://sourceforge.net/projects/canteen-calandreta
n°2275758
zbineulong​time
☱☱☱☱☱☱☱☱☱☱☱☱
Posté le 16-02-2016 à 13:45:31  profilanswer
 

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 :/

n°2275794
rufo
Pas me confondre avec Lycos!
Posté le 17-02-2016 à 10:48:22  profilanswer
 

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 Cantine Calandreta : http://sourceforge.net/projects/canteen-calandreta
n°2275807
zbineulong​time
☱☱☱☱☱☱☱☱☱☱☱☱
Posté le 17-02-2016 à 13:44:53  profilanswer
 

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 + ? :)
 

n°2275808
gilou
Modérateur
Modzilla
Posté le 17-02-2016 à 14:16:36  profilanswer
 

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!    --    In umbra igitur pugnabimus. --
n°2275810
rufo
Pas me confondre avec Lycos!
Posté le 17-02-2016 à 17:21:18  profilanswer
 

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 Cantine Calandreta : http://sourceforge.net/projects/canteen-calandreta
mood
Publicité
Posté le 17-02-2016 à 17:21:18  profilanswer
 

n°2275817
zbineulong​time
☱☱☱☱☱☱☱☱☱☱☱☱
Posté le 17-02-2016 à 21:02:13  profilanswer
 

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 :)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Concommation mémoire variables php

 

Sujets relatifs
libération mémoireAllocation Mémoire pour tableau 2 dimensions
Transmission variablesPassage de variables entre méthode imbriquées
Ajout de variables dans un tableau[adwords] ajouter des variables de tracking à mes annonces
Javascript : fusionner deux variablesImporter valeurs depuis un fichier texte dans des variables VBS
[PHP] Url Rewriting et passage de variables GETincorporer plusieurs variables dans du code python
Plus de sujets relatifs à : Concommation mémoire variables php


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR