Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
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:
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
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
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
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
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
J'ai posté le bug chez SAP pour que les gourus PB se penchent dessus.
http://scn.sap.com/thread/3528613
Hors ligne
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
D'autres gouros ont répondu.
Deux solutions, soit le setnull, soit remplir l'array à l'envers:
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
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
Merci beaucoup pour vos recherches.
Malheureusement ces 2 solutions ne change rien.
Hors ligne
Change le design de ton appli, c'est là qu'est le problème.
Hors ligne