Jump to content

Perte de mémoire


eprems

Recommended Posts

Bonjour,

 

Ma santé va bien... enfin jusqu'à ce que je développe un module Prestashop :)

 

Ma boutique : près de 90 000 produits.

 

Un traitement : vérifier que tous les produits sont cohérents avec une source extérieure d'information.

 

L'algo :

Select tous les ID produit

Pour chaque ID

    $p = new Product ($id_product);

   Traitement

    unset ($p)

 

Sauf que au bout de ~80 000 produits, plus de mémoire.

J'ai augmenté le paramètre php à 1024M, ce qui me parait plus que raisonnable et qui m'a permis de monter à cette valeur...

 

Le unset ne libère pas tout et je n'ai pas trouvé de destructeur dans la classe Product.

 

Euhh... qu'est-ce que voulais-je dire, déjà ???

 

Ah oui... quelqu'un aurait une idée pour me sortir de là ?

Je ne suis pas un pro de php (plus de C++).

 

A vous lire !

Link to comment
Share on other sites

Bonjour,

 

Je vois plusieurs idées pour résoudre ou contourner le problème.

 

1°) Il est possible d'implémenter le destructeur en php, dans l'override de la classe pour la propreté, ou dans ton module, dépends de ton code (a partir de php 5.3 de , il y a même le garbage collector).

 

2°) Le traitement peut éventuellement se faire en extérieur ? (via le webservice par exemple, avec un retour true ou nouvelle valeur si besoin d'update).

 

3°) Au pire, morceler le traitement (par lot de 30000 par exemple), sur 3 cron lancés à un certain intervalle.

 

Cordialement,

Edited by Whoami (see edit history)
Link to comment
Share on other sites

Salut,

 

C'est normal car l'ObjectModel garde en mémoire les données du produit (c'est une optimisation assez foireuse car les objets sont trop souvent réinstanciés dans le code au lieu d'être passés en paramètre des fonctions).

 

A moins que tu aies vraiment besoin d'instancier les classes, je te conseil plutôt d'uniquement travailler avec le tableau retournée par la requête SQL.

 

Autrement tu peux faire $product->clearCache() pour vider le cache de ton produit.

Link to comment
Share on other sites

Bonjour;

 

@WhoAmI (il semble que vous ayez aussi une perte de mémoire :wacko:  :D )

Merci pour ces 3 idées...

Je suis bien en 5.3, j'ai utilisé les fonctions de "gestion" de mémoire, mais je n'ai pas trouvé matière pour optimiser.

WebService, je n'y avais pas pensé, je regarderai si éventuellement je coince.

Morceler... on devient dépendant du nombre de produits qui peut grossir.

 

La nuit portant conseille, j'ai abouti à 2 autres solutions :

Sur l'idée de morceler, faire traiter par lot dans un script dédié et appelé par CURL. Une fois le process fini, la mémoire est libérée de faite.

Autre idée, mais ne criez pas... Dans la phase mise à jour d'information (prix, stock, status) attaquer la base de données en directe. Je n'ai pas l'idée de "vendre" mon module, donc c'est entre moi et moi :rolleyes:

 

@Raphaël

Je crée et modifie des produits. Dans le 2ième cas, la méthode save () est bien pratique...

Je te teste la méthode de ObjectModel pour voir si je vais plus loin...

 

@all

Merci à vous 2 pour vos réponses rapides, elles me permettent d'avancer dans la finalisation de mon développement.

 

Bruno

Link to comment
Share on other sites

Bah c'est sur que ça vient de là la fuite de mémoire, puisqu'à chaque fois que tu instancies un produit il y a un tableau interne en cache qui se remplie des données récupérées en base, tableau que tu ne peux vider qu'avec clearCache. C'est parce que ce tableau n'est même pas stocké directement dans le produit que le unset() n'a aucun effet.

Link to comment
Share on other sites

@Raphaël

Je ne m'émettais aucun doute sur ta proposition... Désolé que tu aies pu le comprendre ainsi.

 

Donc, j'ai testé et c'est super... Mon scipt va jusqu'au bout !

 

Grand merci de m'avoir déniché cette méthode qui rend service, je m'en vais la généraliser dans mon code.

 

Bruno

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...