Powerbuilder pour les completement Geeks !

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 10-01-2011 16:17:10

Garth  
Membre
Date d'inscription: 27-11-2009
Messages: 15
Pépites: 63
Banque: 0

[RESOLU] Problème de lenteur

Bonjour à tous,

Au sein de ma boite nous venons de livrer une nouvelle version de notre application.
On nous fait remarquer quelques lenteurs qui sont identifiés sur une 10 aines de postes alors que aucun n'est relevé sur les 200 autres.
Sur ces postes, la mémoire se charge d'un coup au lancement de l'application sans aucune explication... Cela varrie, 200Mo sur certains, 700 sur d'autres et jusqu'à 1.7GO sur un poste !

Notre nouvelle version englobe un gros projets pour lequel nous avons :
- migré de PB9 à PB11.5
- utilisé une connexion endriver SQL server natif plutôt que l'ODBC
- utilisé un OCX Foxit Reader pour pouvoir lire des PDF dans l'appli
- revu notre navigation dans l'appli via de images comme boutons dont toutes les GIF ou PNG sont inclues dans le PBR

On recherche aujourd'hui la cause de ce chargement mémoire... Si jamais certains d'entre vous ont éprouvé ce genre de problème nous sommes prenneurs de toute idée ou piste.
Alexis

Dernière modification par Garth (11-08-2011 12:23:41)

Hors ligne

 

#2 10-01-2011 16:45:00

vince.janssens  
Membre Geek
Date d'inscription: 02-06-2008
Messages: 69
Pépites: 189
Banque: 0

Re: [RESOLU] Problème de lenteur

Cela peut provenir des objets non détruit dans un process réccurent, ce qui peut faire gonfler la mémoire considérablement si
les objets générés consomment beaucoup de ressources (souvent des datastores ou datawindows généralement)

Nous avons déjà rencontré ce genre de problèmes que nous avions corrigé temporairement en utilisant la fonction GarbageCollect( ) qui provoque la destructions des objets en mémoires qui ne sont plus utilisés.

Le plus difficile est de localiser le process qui provoque ce gonflement de mémoire...

A+

Vincent

Hors ligne

 

#3 25-02-2011 09:17:31

Garth  
Membre
Date d'inscription: 27-11-2009
Messages: 15
Pépites: 63
Banque: 0

Re: [RESOLU] Problème de lenteur

vince.janssens a écrit:

Le plus difficile est de localiser le process qui provoque ce gonflement de mémoire...

Avez vous des trucs et astuces pour identifier les process ?
C'est dommage que rien n'existe dans PB pour savoir ce que consomme chaque objet de l'appli en mémoire

Hors ligne

 

#4 25-02-2011 09:27:15

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: [RESOLU] Problème de lenteur

Garth a écrit:

Avez vous des trucs et astuces pour identifier les process ?

Exécuter le programme pas à pas et observer l'évolution de la mémoire utilisée dans le gestionnaire de tâches.


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#5 25-02-2011 09:34:00

Garth  
Membre
Date d'inscription: 27-11-2009
Messages: 15
Pépites: 63
Banque: 0

Re: [RESOLU] Problème de lenteur

C'est ce qu'on a cherché à faire... sans grand succés

Hors ligne

 

#6 28-02-2011 09:10:43

Aloneg  
Membre Geek
Date d'inscription: 14-02-2007
Messages: 30
Pépites: 1,182
Banque: 37,934,892,619

Re: [RESOLU] Problème de lenteur

Le même problème chez nous était lié à la création/destruction d'un nombre très important de datastores... la mémoire n'étant pas complètement libérée par PB à chaque destruction, elle gonfle anormalement.

Vous n'auriez pas des boucles dans lesquelles des datastores sont créés puis détruits (ou même pas détruits du tout !) ?

Hors ligne

 

#7 28-02-2011 09:31:21

Garth  
Membre
Date d'inscription: 27-11-2009
Messages: 15
Pépites: 63
Banque: 0

Re: [RESOLU] Problème de lenteur

J'ai effectivement des boucles avec des DS créés dedans...
Mais ce ne sont pas des DS stockant des tonnes de données.
Pour le coup vous aviez remplacé les DS par quoi ?
Merci de votre réponse.

Hors ligne

 

#8 28-02-2011 10:20:13

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: [RESOLU] Problème de lenteur

Essaye de limiter le nb de DS, par exemple ne pas les créer à chaque passage dans la boucle mais les créer hors de la boucle et les réinitialiser à chaque passage dans la boucle.


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#9 28-02-2011 12:29:07

Aloneg  
Membre Geek
Date d'inscription: 14-02-2007
Messages: 30
Pépites: 1,182
Banque: 37,934,892,619

Re: [RESOLU] Problème de lenteur

Garth a écrit:

J'ai effectivement des boucles avec des DS créés dedans...
Mais ce ne sont pas des DS stockant des tonnes de données.
Pour le coup vous aviez remplacé les DS par quoi ?

erasorz a écrit:

Essaye de limiter le nb de DS, par exemple ne pas les créer à chaque passage dans la boucle mais les créer hors de la boucle et les réinitialiser à chaque passage dans la boucle.

C'est exactement ce qu'on a fait, et ça a résolu le problème... le nombre de lignes dans le datastore n'empêchera pas l'accumulation de mémoire prise à chaque destruction.

Hors ligne

 

#10 28-02-2011 14:03:29

buck  
Modérateur
Lieu: Dijon
Date d'inscription: 31-07-2008
Messages: 747
Pépites: 1,028,843
Banque: 171,170,849,654

Re: [RESOLU] Problème de lenteur

Bonjour,

J'ai également remarqué qu'une datastore passé en argument d'une méthode ou d'une fonction par valeur augmente la mémoire occupée puisque les données sont dupliquées (logique).
Mais, cette mémoire n'est pas correctement libérée en sortie de fonctions (PB 11.2).

S'il n'y a pas d'impacts (datastore utilisée en lecture par exemple), il est préférable de passer par référence les datastores. Cette petite modification dans notre application a eu une large impact sur la mémoire occupée surtout lorsqu'un large volume de données est concernée.

Hors ligne

 

#11 28-02-2011 16:09:47

xlat  
0xc0000005
Award: bf
Lieu: Tanger (طنج)
Date d'inscription: 04-12-2010
Messages: 720
Pépites: 11,343
Banque: 100,221,387,868,884,300
Site web

Re: [RESOLU] Problème de lenteur

buck a écrit:

Bonjour,

J'ai également remarqué qu'une datastore passé en argument d'une méthode ou d'une fonction par valeur augmente la mémoire occupée puisque les données sont dupliquées (logique).
Mais, cette mémoire n'est pas correctement libérée en sortie de fonctions (PB 11.2).

Pour les objets, c'est la référence à l'objet qui est passé par valeur, donc dupliqué et pas l'objet lui même, d'ailleurs si tu ajoutes/supprimes des lignes d'une datastore passée en argument par valeur, l'appelant voit les modifications effectuées par l'appelé.


https://lut.im/eJINqa9o/vAtyxD0h "Don't believe everything you read on the Internet"
    -- Abraham Lincoln

www.ngs.ma

Hors ligne

 

#12 01-03-2011 08:29:46

buck  
Modérateur
Lieu: Dijon
Date d'inscription: 31-07-2008
Messages: 747
Pépites: 1,028,843
Banque: 171,170,849,654

Re: [RESOLU] Problème de lenteur

Bonjour,

Oui, j'ai été un peu approximatif. En fait, pour les objets, il devrait toujours être passé par référence même si l'argument de passage est de type value (Il devrait s'agir d'un pointeur sur 32 bits je suppose).

J'ai constaté un large changement de comportement selon que le passage est de type value ou reference. Par reference, on constate aucun changement de l'occupation mémoire tandis que par value on a l'impression que l'occupation mémoire s'accroit selon la quantité de données "on a l'impression qu'il y a une duplication des données". J'admet que pour un objet, on devrait s'attendre à un comportement strictement identique dans les 2 cas, mais ce n'est pas le cas dans la réalité.

Nous avons réglé simplement des gros problèmes d'occupation excessive de la mémoire en modifiant simplement le type de passage d'arguments de "value" à "reference". Ceci est effectivement à prendre au conditionnel, ce problème était peut être spécifique à la version de Powerbuilder que nous utilisions à l'époque à vérifier sur d'autres versions, certaines versions de Powerbuilder sont connues pour leur "memory leak".

Hors ligne

 

#13 01-03-2011 09:10:34

shahin  
Modérateur
Award: bf
Lieu: val de marne
Date d'inscription: 26-09-2006
Messages: 938
Pépites: 8,675,050,269
Banque: 16,218,225,127,617

Re: [RESOLU] Problème de lenteur

Garth a écrit:

...C'est dommage que rien n'existe dans PB pour savoir ce que consomme chaque objet de l'appli en mémoire

Euh, pas d'accord.

http://img4.hostingpics.net/pics/879702systemoption.gif

Puis,

http://img4.hostingpics.net/pics/504352profiling2.gif


never let people work on more than one thing at once.

Hors ligne

 

#14 11-08-2011 12:19:26

Garth  
Membre
Date d'inscription: 27-11-2009
Messages: 15
Pépites: 63
Banque: 0

Re: [RESOLU] Problème de lenteur

Je reviens sur le post pour dire qu'on a finit par trouver l'origine de notre problème...
notre appli est affichée sur chaque poste sur 2 écrans.
dans l'appli, on gérait une variable de type array dans laquelle on stockait une ino spécifiant si la fenêtre était ouverte sur l'écran de gauche ou sur l'écran de droite du type gs_fenetre_ecran[x] = 'D' ou 'G'. Or, on utilisait comme index du tableau le handle de la fenêtre que nous renvoyait windows pensant que PB créait uniquement en mémoire la référence à l'index spécifiée....
L'erreur dans notre raisonnement c'est que si on créé un tableau avec un index x, PB lui créé pas un tableau de 1 élément mais un tableau de x élément, même si les élément de 1 à x-1 ne sont pas renseigné. et comme Windows renvoie des handles immenses du 15984420 on se retrouvaient avec des tableaux énormes qui explosaient la mémoire.

Voilà pour la petite histoire... Ca peut servir ;-).

Hors ligne

 

#15 11-08-2011 13:16:47

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1118
Pépites: 4,296,080,204
Banque: 9,223,372,036,854,776,000
Site web

Re: [RESOLU] Problème de lenteur

L'erreur dans notre raisonnement c'est que si on créé un tableau avec un index x, PB lui créé pas un tableau de 1 élément mais un tableau de x élément, même si les élément de 1 à x-1 ne sont pas renseigné. et comme Windows renvoie des handles immenses du 15984420 on se retrouvaient avec des tableaux énormes qui explosaient la mémoire.

Ah ben voui...

On dirait que cette façon d'utiliser le tableau s'apparente plus à une table de hachage (dictionnaire) plutôt qu'à un tableau.

Okazou, il existe une possibilité d'utiliser des hashtables en pb, en passant par une extension PBNI : PbniHash


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22