IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[POO] [Classe/Objet/Mémoire] Gestion d'un vecteur d'instances...


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 50
    Points : 64
    Points
    64
    Par défaut [POO] [Classe/Objet/Mémoire] Gestion d'un vecteur d'instances...
    Bonjour à vous tous,

    Je viens vers vous car je me retrouve face à un problème de taille en PHP.

    L'application que je suis en train de coder doit pouvoir gérer une liste d'objets. Alors vous allez me dire, facile en PHP, le problème n'est pas là c'est que j'en ai ~ 700.000, et la mémoire consommée approche des 800 Mo

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class MyObject {
      protected $n;
      protected $list;
     
      function __construct($n, $list)
      {
        $this->n = $n;
        $this->list = $list;
      }
    }
    Voici un code reproduisant l'allocation des 700.000 objets.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $objects = array();
    for($i =1 ; $i<=700.000 ; $i++) {
     
      $objects[] = new MyObject($i, array(1, 2, 3, 4, 5));
    }
    À la découverte de ce problème, j'ai tenté d'ajouter à ma liste directement le tableau sans passer par l'encapsulation dans un objet. Mais la mémoire consommée est toujours d'un ordre de grandeur d'un autre monde (300 Mo).

    J'ai aussi essayé en utilisant une implémentation d'une liste chainée pour éviter d'utiliser les array, mais le problème est le même, la mémoire utilisée par PHP reste énorme.

    Bref, venant du monde du C, je suis un peu effaré de voir la taille allouée en mémoire. Alors soit PHP n'est pas fait pour ça, soit mon code n'est pas correct, alors à votre avis ?

    À titre de comparaison en C on aurait besoin de ((n = 4 octets) + (list = (4 octets x 5)) + (pointeur sur la liste = 4 octets)) x 700.000 = ~ 18 Mo.

    Pour info j'utilise la version PHP 5.1.2 sous Windows XP.

  2. #2
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 681
    Points
    18 681
    Par défaut
    ben php n'est pas fait pour gérer dans de trucs en même temps... du moins je ne pense pas.


    tu devrais peut-être te tourner vers un base de données, tu pourrais ainsi avoir énormement de données, pouvoir sélectionner celles que tu souhaites dans l'ordre que tu veux, et le tout très facilement... une fois qu'on connait les rudiments du SQL


    mais comme je ne sais pas quel en est l'usage, tu peux aussi aller voir du côté des cgi... ou un morceau écrit en C te reverra le résultat d'un tel traitement.
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  3. #3
    Rédacteur

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 695
    Points : 1 071
    Points
    1 071
    Par défaut
    Alors soit PHP n'est pas fait pour ça
    pas vraiment en qd meme

    Pose toi la question, as-tu vraiment besoin de charger les 700 000 en meme temps?
    sinon, stocke dans une bdd, prend au fur et à mesure et restocke dans la bdd
    Articles sur developpez.com
    - Gestion des exceptions avec PHP5
    - Chiffrement et hash en PHP contre l'attaque Man in the middle
    - Aedituus - Espace membre sécurisé en PHP5

  4. #4
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    quelque soit le langage utilisé, chargé autant d'objet en mémoire est une abération.
    Alunissage : Procédé technique consistant à déposer des imbéciles sur un rêve enfantin.

    Cours | FAQ | Sources Javascript
    Cours | FAQ | Sources PHP
    Mes Articles

  5. #5
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 50
    Points : 64
    Points
    64
    Par défaut
    quelque soit le langage utilisé, chargé autant d'objet en mémoire est une abération.
    Monsieur le modérateur quand on ne connait pas l'usage il vaut mieux s'abstenir de ce genre de commentaires, à croire que vous n'avait jamais fait de calcul combinatoire ! Prétendre que d'allouer 700.000 objets/strctures quelques que soit le langage est une abération, cette affirmation en est effectivement une

    Je vous rassure je ne fais pas de la combinatoire directement en PHP non plus, mais je dois faire un post traitement sur des résultats stockés dans une base de données. Le cas présenté est un cas extrême car sur mes 4000 définitions j'en ai une centaine qui ont de 200.000 a 700.000 éléments liés. Pour chaque définition je dois charger l'intégralité des éléments, et si je ne le fais pas au début, à la fin du process ils le seront tous de toute façon.

    Dans la moyenne c'est 4500 et tout ce passe très bien au niveau de la vitesse et niveau de la mémoire, cela reste acceptable. Mais à ces niveaux ca ne l'est plus, 800 Mo c'est beaucoup trop pour ce que cela doit faire.

    L'encapsulation dans des objets je peux éventuellement m'en passer, mais pour l'instant mis à part serialiser les données sous forme de chaine et gérer une liste de chaines (~ 90 Mo de mémoire), je n'ai pas trouvé d'autres parades pour que php soit moins gourmand. En contre partie la charge CPU augmente car à chaque fois que j'ai besoin d'un élément il faut que je le décode.

  6. #6
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Et si tu nous donnais un peu plus de détails, peut-être qu'on pourrait t'aiguiller sur une piste plus performantes ?

    - Natures des objets ?
    - Liens entre eux ?
    - Besoin fonctionnel ?
    - Algo utilisé ?
    - Age du capitaine ?
    - ... ?

  7. #7
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 50
    Points : 64
    Points
    64
    Par défaut
    mais comme je ne sais pas quel en est l'usage, tu peux aussi aller voir du côté des cgi... ou un morceau écrit en C te reverra le résultat d'un tel traitement.
    J'ai déjà créé une extension PHP en C pour accélerer certains traitements. Malheureusent à cet endroit j'ai une interaction avec la db, et ca m'obligerait à coder l'accès de la db dans l'extension PHP en plus de celle codée en PHP.

    Si je dois me taper la couche d'accès à la db en C autant tout faire en C et publier le process avec un service web via gSOAP. Si je pouvais éviter de jetter à la poubelle tout ce que je viens de coder ca ne serait que mieux, même si je commence à en douter sérieusement

  8. #8
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 50
    Points : 64
    Points
    64
    Par défaut
    - Natures des objets ?
    des combinaisons...

    - Liens entre eux ?
    J'ai un problème qui a été résolu dont le résultat a été stocké dans une db. Ce sont les fameux objets que je dois récupérer en mémoire.

    - Besoin fonctionnel ?
    Faire du post process au travers d'une application web à la demande. Et l'algo utilisé (y en a pas d'autres) sur le process m'obligent à avoir l'ensemble des éléments en mémoire malheureusement. Sur ce post process je n'ai aucune contrainte de temps, mais bon 800 Mo ce n'est tout simplement pas acceptable.

    L'appli ne fait pas que ça, mais c'est une des fonctions... Elle permet ensuite de l'administration basique, consulter les améliorations qui ont été publiées, demander l'optimisation d'une solution via un serveur déporter qui communique via le protocole SOAP, etc.

    Je vais avoir le même problème car dans l'extension PHP que j'ai développé j'utilise un algo pour vérifier que la solution est bien valide et mon extension prend en paramètre le fameux vecteur qui peut avoir une taille de 700.000 éléments.

  9. #9
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    désolé si j'ai paru un peu abrupt mais sincèrement, vouloir charger 700000 objets en mémoire, surtout en php ...

    Pour ce qui est de ton histoire de bdd, penches toi sur pdo qui est codé en c. Ses perfs sont meilleures que les fonctions natives.

    Je ne pense pas que php soit fait pour gérer des choses comme ça, enfin il peut mais avec de rosses consos de mémoires, ça serais d'ailleurs pareil en java.

    Apres peut etre que sous linux ca serais plus performant que sous windows mais ca sera pas faramineux non plus.
    Alunissage : Procédé technique consistant à déposer des imbéciles sur un rêve enfantin.

    Cours | FAQ | Sources Javascript
    Cours | FAQ | Sources PHP
    Mes Articles

  10. #10
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 50
    Points : 64
    Points
    64
    Par défaut
    J'ai essayé avec Java, une matrice de 700000 x 5 consomme 25 Mo de mémoires et la JVM alloue un tas de 45 Mo.

    Runtime runtime = Runtime.getRuntime();

    int items[][] = new int[700000][5];

    System.out.println("Heap: " + (runtime.totalMemory()));
    System.out.println("Usage: " + (runtime.totalMemory() - runtime.freeMemory()));
    En PHP n'y a t'il pas moyen de gérer une matrice plutot qu'un array de array ?

  11. #11
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    le probleme c est que php n'est pas typé, regardes dans la spl, tu trouveras peut etre ton bonheur
    http://www.php.net/~helly/php/ext/spl/classes.html
    peut etre ca sera plus performant
    Alunissage : Procédé technique consistant à déposer des imbéciles sur un rêve enfantin.

    Cours | FAQ | Sources Javascript
    Cours | FAQ | Sources PHP
    Mes Articles

  12. #12
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 50
    Points : 64
    Points
    64
    Par défaut
    J'ai déjà fait un tour dans les SPL et essayé les ArrayObjet et les SplObjectStorage mais la mémoire utilisée est exactement la même car le type array doit être le support de ces implémentations.

    + http://www.php.net/~helly/php/ext/spl/

    Je me suis fait une raison et je passe à Java. J'ai semble-t-il un peu surestimé PHP. Je vous rassure je ne l'abandonne pas pour autant

    PHP est un très bon langage mais pas pour faire ce que je suis en train de faire et c'est bien dommage.

Discussions similaires

  1. [XML] [POO] [Classe/Objet]xml
    Par 2xyo dans le forum Langage
    Réponses: 19
    Dernier message: 21/03/2006, 19h00
  2. [POO] [Classe/Objet] Conseils à un débutant en POO
    Par nicocolt dans le forum Langage
    Réponses: 9
    Dernier message: 08/03/2006, 10h06
  3. Réponses: 15
    Dernier message: 29/12/2005, 10h32
  4. [POO] projet ->soutirer les classes objets
    Par .:dev:. dans le forum C++
    Réponses: 10
    Dernier message: 14/06/2005, 23h05
  5. Réponses: 3
    Dernier message: 19/05/2005, 10h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo