PB à toute heure et à tout moment. (à parcourir avec modération)

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 26-03-2014 14:48:30

MANPM  
Membre
Lieu: SERRES-CASTET
Date d'inscription: 18-12-2012
Messages: 11
Pépites: 61
Banque: 0

Comment libérer complétement la mémoire avec PB

Bonjour à tous,

Je travaille avec la version 12 de PB.
Je rencontre des soucis de libération mémoire.
Voici un petit code tout simple qui reproduit ce phénomène:

Code: pb

Double t_1[], t_2[]
long ll_i

for ll_i = 1 to 50000000
  t_1[ll_i] = 1
next
t_1 = t_2
garbagecollect()


Lors du chargement du tableau, l'allocation mémoire augmente.
Cependant, aprés la boucle, celle-ci n'est pas libérée malgré le garbagecollect()...
Si j'exécute ce traitement x fois, il n'y a pas d'allocation supplémentaire.
Je suis contraint de quitter complètement le programme pour libérer la mémoire.

D'aprés différents posts que j'ai lu, cela semble lié à la version de PB et sa gestion de la mémoire.

Y a t'il un moyen pour contourner ce phénoméne afin de libérer la mémoire?

Hors ligne

 

#2 27-03-2014 13:33:18

patrick_remy  
Membre
Lieu: bruxelles
Date d'inscription: 28-05-2008
Messages: 13
Pépites: 39
Banque: 0

Re: Comment libérer complétement la mémoire avec PB

Et en mettant explicitement une seule valeur dans t_2?
genre:
t_2[] = { 0 }

Sinon, la datawindow se tient bien avec bcp de records.

Hors ligne

 

#3 27-03-2014 13:35:03

patrick_remy  
Membre
Lieu: bruxelles
Date d'inscription: 28-05-2008
Messages: 13
Pépites: 39
Banque: 0

Re: Comment libérer complétement la mémoire avec PB

oups je viens de voir qu'il y a 50 millions de records. Je retire ce que j'ai dit pour la dw :-)

Hors ligne

 

#4 27-03-2014 13:38:31

patrick_remy  
Membre
Lieu: bruxelles
Date d'inscription: 28-05-2008
Messages: 13
Pépites: 39
Banque: 0

Re: Comment libérer complétement la mémoire avec PB

autre idée, créer une array avec une taille fixe. Je sais que powerbuilder gère la mémoire différement quand la taille est fixée d'avance.

Hors ligne

 

#5 28-03-2014 12:46:23

MANPM  
Membre
Lieu: SERRES-CASTET
Date d'inscription: 18-12-2012
Messages: 11
Pépites: 61
Banque: 0

Re: Comment libérer complétement la mémoire avec PB

J'ai testé avec une taille fixe. Effectivement Powerbuilder gére différemment la mémoire.
Il semble libérer une partie de la mémoire aprés le traitement (environ 1/5ème) de la mémoire allouée totale.
De plus, il n'est pas possible de définir une taille fixe aussi importante...

Merci quand même pour cette piste.

Hors ligne

 

#6 29-03-2014 08:23:13

patrick_remy  
Membre
Lieu: bruxelles
Date d'inscription: 28-05-2008
Messages: 13
Pépites: 39
Banque: 0

Re: Comment libérer complétement la mémoire avec PB

J'ai posté le bug chez SAP pour que les gourus PB se penchent dessus.

http://scn.sap.com/thread/3528613

Hors ligne

 

#7 30-03-2014 07:51:41

patrick_remy  
Membre
Lieu: bruxelles
Date d'inscription: 28-05-2008
Messages: 13
Pépites: 39
Banque: 0

Re: Comment libérer complétement la mémoire avec PB

D'après les gourous, c'est un comportement normal de pb qui ne rend pas la mémoire au système d'exploitation.
Si pb a besoin de nouveau de mémoire, il la prendra dans celle qui a déjà été allouée par le système d'exploitation, ce qui est plus rapide.

De plus, ils disent que 50 millions de records dans une array est un pauvre design d'application. Les données doivent être stockées dans la base de données et récupérées quand c'est nécessaire.

Toujours d'après eux, si c'est vraiment nécessaire d'avoir toutes les données en mémoire en même temps, il est mieux d'utiliser un datastore.

Hors ligne

 

#8 31-03-2014 11:00:49

patrick_remy  
Membre
Lieu: bruxelles
Date d'inscription: 28-05-2008
Messages: 13
Pépites: 39
Banque: 0

Re: Comment libérer complétement la mémoire avec PB

D'autres gouros ont répondu.

Deux solutions, soit le setnull, soit remplir l'array à l'envers:

Code: pb

Double t_1[], t_2[]

long ll_i 

SetNull (t_2)

for ll_i = 1 to 50000000
  t_1[ll_i] = 1
next

t_1 = t_2

garbagecollect() 


Soit

Code: pb

Double t_1[], t_2[]

long ll_i 

for ll_i = 50000000 to 1 STEP -1
     t_1[ll_i] = 1
next


t_1 = t_2


Hors ligne

 

#9 07-04-2014 13:21:19

MANPM  
Membre
Lieu: SERRES-CASTET
Date d'inscription: 18-12-2012
Messages: 11
Pépites: 61
Banque: 0

Re: Comment libérer complétement la mémoire avec PB

Merci beaucoup pour vos recherches.
Malheureusement ces 2 solutions ne change rien.

Hors ligne

 

#10 07-04-2014 14:52:14

rincevent  
Modérateur
Award: bf
Lieu: Belgique
Date d'inscription: 06-02-2007
Messages: 722
Pépites: 100,002,023
Banque: 0

Re: Comment libérer complétement la mémoire avec PB

Change le design de ton appli, c'est là qu'est le problème.


http://img114.imageshack.us/img114/8519/userbar175801nb.gif
Pourquoi ne puis-je vivre comme n'importe quel être humain ? Pourquoi mon destin est-il de ne pouvoir cesser de me battre ?

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22