(1) 2 »


[Résolu] Saturation mémoire
DSI WDF
Inscrit:
05/05/2004 13:46
Post(s): 314
Bonjour,
Malgré tous mes efforts et l'utilisation de toutes les libérations de mémoire possible je suis confronté à un problème majeur.
J'utilise l'accès client/serveur et lors de boucle des plus simple, la mémoire du serveur se remplit sans cesse jusqu'à rupture...
Le simple fait de définir(sans allouer) une source de données à l'intérieur de la boucle sature la mémoire...
Afin d'intégrer des calculs portant sur plusieurs milliers d'enregistrements je souhaiterai libérer la mémoire (ctrl+alt+supp) au fur et à mesure, comment faire ???

Merci d'avance

ps:multitache est sans effet

Contribution le : 22/07/2005 15:53
Créer un fichier PDF de la contribution Imprimer


Re: Saturation mémoire
Animateur WDF
Inscrit:
26/06/2002 16:24
De wdforge.org
Post(s): 2822
Bonjour
Et si vous faites un HAnnuleDéclaration avant l'affectation de la source (et en sortie de boucle) ?

Le mieux serait de nous donner un peu plus d'informations...

Contribution le : 22/07/2005 16:04
_________________
R&B
Contact, CV.
Créer un fichier PDF de la contribution Imprimer


Re: Saturation mémoire
DSI WDF
Inscrit:
05/05/2004 13:46
Post(s): 314
Je vous prépare un ptit bout de code et vous l'envoie le plus vite possible

Contribution le : 22/07/2005 16:10
Créer un fichier PDF de la contribution Imprimer


Re: Saturation mémoire
DSI WDF
Inscrit:
05/05/2004 13:46
Post(s): 314
Alors voici un exemple de code qui sur mon serveur fait grimper l'utilisation de la mémoire progressivement sans jamais la faire retomber...
Bien sur il s'agit d'une boucle infini mais c'est uniquement pour l'exemple


//Renvoie le nombre de jours ouvrés à partir d'une date
PROCEDURE GetNbJourOuvre(d est une Date)

Calc_nbJourOuvre est un entier
NumSemaine est un entier
Dtemp est une Date=d
cle est une chaîne

Numsemaine=NuméroDeSemaine(d)
//On définit par nature 5 jours ouvrés par semaine
Calc_nbJourOuvre=5*NumSemaine
//On soustrait à ces jours ouvrés les jours ouvrés postérieurs à la date mais appartenant à la semaine (samedi/dimanche non inclus)
Dtemp..Jour++
TANTQUE NuméroDeSemaine(d) = NuméroDeSemaine(Dtemp) ET DateVersJour(Dtemp)<6
	Calc_nbJourOuvre--
	Dtemp..Jour++
FIN
//On retire maintenant tous les jours fériés inférieurs à cette date
HDésactiveFiltre(JOURFER)
cle=HFiltre(JOURFER,"Mois<='"+d..Mois+"'")
HLitPremier(JOURFER,cle)
TANTQUE PAS HEnDehors(JOURFER)
	SI JOURFER.Mois=d..Mois ET JOURFER.Jour>d..Jour ALORS HLitSuivant(JOURFER,cle)
	Calc_nbJourOuvre--
	
	HLitSuivant(JOURFER,cle)
FIN
HDésactiveFiltre(JOURFER)


RENVOYER Calc_nbJourOuvre


//Code affecté au bouton permettant le test
TANTQUE Vrai
	NbJour est un entier=GetNbJourOuvre(DateSys())
FIN

Contribution le : 22/07/2005 16:24
Créer un fichier PDF de la contribution Imprimer


Re: Saturation mémoire
DSI WDF
Inscrit:
05/05/2004 13:46
Post(s): 314
Personne n'a donc testé ce code ???
Vous fait-il vous aussi saturer la mémoire en C/S ???

Contribution le : 25/07/2005 09:28
Créer un fichier PDF de la contribution Imprimer


Re: Saturation mémoire
Animateur WDF
Inscrit:
19/01/2004 13:48
De www.sigmasys.fr
Post(s): 988
Salut,

perso, je ne ferais pas 2 Hlitsuivant identique dans la même boucle.
Risque de plantage sur hendehors non testé.

a+

Tof

Contribution le : 25/07/2005 10:18
Créer un fichier PDF de la contribution Imprimer


Re: Saturation mémoire
DSI WDF
Inscrit:
05/05/2004 13:46
Post(s): 314
Oui merci c'est vrai mais c'est un détail par rapport à la question posée...
VOtre mémoire sature-t'elle aussi ?

Contribution le : 25/07/2005 10:33
Créer un fichier PDF de la contribution Imprimer


Re: Saturation mémoire
Developpeur WDF
Inscrit:
24/11/2003 10:38
De Dieppe
Post(s): 118
Je n'ai pas l'habitude des ordres Hxx mais au lieux de faire une requete et la parcourir dans une boucle, pourquoi ne pas faire la requete directement ?

"Select count(MaCléPrimaire) as total from ma_table where Jour<'" + d..Jour + "'"

total renvoie le nombre de jour férié antérieur a la date, ce que j'ai compris par rapport a la requete.

N'ayant pas la structure de la table c'est un peu complique mais pourquoi mélanger des mois et des jours ?

Contribution le : 25/07/2005 11:06
Créer un fichier PDF de la contribution Imprimer


Re: Saturation mémoire
Utilisateur WDF
Inscrit:
22/03/2005 14:40
De Lyon Rhône France
Post(s): 51
Bonjour,
sauf votre respect, je ne comprends pas le "tantque vrai".

Citation :

GoZeub a écrit :
//Code affecté au bouton permettant le test
TANTQUE Vrai
	NbJour est un entier=GetNbJourOuvre(DateSys())
FIN


--
Cordialement
Christophe Charron

Contribution le : 25/07/2005 11:11
Créer un fichier PDF de la contribution Imprimer


Re: Saturation mémoire
Developpeur WDF
Inscrit:
24/11/2003 10:38
De Dieppe
Post(s): 118
en fait vous vouliez mettre la base de donnée à rude épreuve ?

Le fait de faire une boucle sur une requete va logiquement faire exploser la base de donnée. Si vous voulez tester la liberation faite un "Multitache (100)" au moins dans cette boucle pour voir si Hyperfile libère les ressources.



Contribution le : 25/07/2005 11:17
Créer un fichier PDF de la contribution Imprimer


Re: Saturation mémoire
DSI WDF
Inscrit:
05/05/2004 13:46
Post(s): 314
Je vous remercie pour vos efforts de réponse sur ce sujet mais j'ai l'impression que vous ne comprenez pas l'utilité réélle de la question posée.
Il ne s'agit pas d'optimiser le code,quoi que cela peut s'avérer parfois utile, ni de décrier la boucle infinie(tantque vrai) mais plutot de comprendre (voire résoudre) pourquoi la mémoire du serveur tombe jusqu'a saturation sans jamais libérer d'espace...
Ce problème de mémoire en C/S n'est j'espère pas généralisé et il doit y avoir une solution pour libérer celle-ci au fur et à mesure du traitement.

Merci d'avance pour votre aide

Contribution le : 25/07/2005 11:22
Créer un fichier PDF de la contribution Imprimer


Re: Saturation mémoire
DSI WDF
Inscrit:
05/05/2004 13:46
Post(s): 314
Multitache(100) et Multitache(-100) n'apportent aucune baisse sur la mémoire...
Le seul moyen de libérer la mémoire étant de fermer la projet... (même la fermeture de la fenêtre par Utilise n'apporte rien)

ARRGGHHHHHHHHHHHHHH

Contribution le : 25/07/2005 11:24
Créer un fichier PDF de la contribution Imprimer


Re: Saturation mémoire
Developpeur WDF
Inscrit:
24/11/2003 10:38
De Dieppe
Post(s): 118
La question etait comment liberer la mémoire certe.

Mais un code propre peut eviter une surcharge de la base de donnée.
Et vouloir mettre en evidence le fait que la BDD est saturée quand on fait une boucle infinie avec une requete n'est pas une tres bonne idée.

En windev comme R&B la dit il existe des fonctions qui sont sensé faire le boulot :
-------------------------------------
HAnnuleDéclaration()
Libère les ressources d'une requête (suite à l'utilisation des fonctionsHExécuteRequête ou HExécuteRequêteSQL).
-----> inutile dans ton cas.
-------------------------------------
HDésactiveFiltre()
Désactive temporairement un filtre sur un fichier (une vue ou une requête).
-----> ne libere pas les ressources.

Le mieux est je pense de faire une demande a pcsoft par le service technique, en ayant preparer un mini projet sinon la question ne sera pas traitée.

Sinon en sachant que HAnnuleDéclaration()
Libère les ressources d'une requête (suite à l'utilisation des fonctions HExécuteRequête ou HExécuteRequêteSQL).
Utilise HExécuteRequêteSQL() pour faire ta requete plutot que HFiltre() et dis nous si les ressources sont libérés.




Je ne rentrerait pas dans le debat pour ou contre hyperfile ou hyperfile C/S.

Mais personellement je conseillerais d'autre BDD.

Contribution le : 25/07/2005 12:09
Créer un fichier PDF de la contribution Imprimer


Re: Saturation mémoire
DSI WDF
Inscrit:
05/05/2004 13:46
Post(s): 314
Tu as raison le code n'est pas très parlant, voici un exemple court et simple afin de simplifier la compréhension de chacun :
TANTQUE Vrai
  HFiltre(Utilisateur,"Supprime=0")
  HLitPremier(Utilisateur)
  HDesactiveFiltre(Utilisateur)
FIN


Ici la mémoire sature alors que si l'on met en commentaire la ligne HLitPremier la mémoire se libère d'elle même...
Nous n'avons malheureusement pas les moyens de s'offrir d'autres SGBD

Contribution le : 25/07/2005 13:33
Créer un fichier PDF de la contribution Imprimer


Re: Saturation mémoire
Animateur WDF
Inscrit:
19/01/2004 13:48
De www.sigmasys.fr
Post(s): 988
pas même un MySQL ?

Contribution le : 25/07/2005 14:00
Créer un fichier PDF de la contribution Imprimer


Re: Saturation mémoire
DSI WDF
Inscrit:
05/05/2004 13:46
Post(s): 314
si bien sur lol mais pourquoi ne pas utiliser le C/S manta livré par défaut...
ça parait logique dans le fond beaucoup moins dans la réalité

Contribution le : 25/07/2005 14:11
Créer un fichier PDF de la contribution Imprimer


Re: Saturation mémoire
Animateur WDF
Inscrit:
19/01/2004 13:48
De www.sigmasys.fr
Post(s): 988
Attendre encore 1 an pour plus de stabilité :)

a+

Tof

Contribution le : 25/07/2005 14:34
Créer un fichier PDF de la contribution Imprimer


Re: Saturation mémoire
Animateur WDF
Inscrit:
26/06/2002 16:24
De wdforge.org
Post(s): 2822
Bonjour,
Après quelques messages, je constate qu'on avance.

On travaille en C/S et c'est le serveur qui est saturé. Il convient alors de se pencher sur ce qui touche à l'accès aux fichiers.

Il semble que la mémoire n'est libérée en C/S après l'annulation d'un filtre sur un fichier pour lequel un parcours a été ammorcé (HLitPremier). Déclarer un filtre n'est en soit que l'affectation d'une condition de parcours sur une clé donc ne constitue effectivement pas un problème d'occumation mémoire. En revanche, activer le parcours, peut, en C/S, assurer une réservation mémoire(vue ?) sur le serveur... et boucler cela peut effectivement être la cause d'une mise en péril de la mémoire du serveur... Enfin, si on tente de suivre la logique.

Que donne une fermeture forcée du fichier à la place de la désactivation du filtre (HFerme)?

En effet, tout comme la pile des pointeurs de contexte HyperFile n'est modifiée tant que l'on ne ferme expressément un fichier ou que celle ci est dépassée (alors le plus ancien ouvert cède la place au nouvel entrant), il est possible qu'en C/S ce fonctionnement ait été étendu aux filtres (comme des contextes supplémentaire). Le tout dans le but de gagner du temps sur le serveur.
HFerme, en revanche, constitue une demande expresse de libération de tous les contextes rattéché au fichier logique... y compris les filtres. C'est ce qui me conduit à faire cette proposition.

Contribution le : 25/07/2005 14:36
_________________
R&B
Contact, CV.
Créer un fichier PDF de la contribution Imprimer


Re: Saturation mémoire
Anonyme
L'idée était bonne mais pas très pratique à utiliser lors de calculs complexes(ex:facturation de milliers de commandes).
Cependant j'ai placé le Hferme(Utilisateur) en fin de boucle et un HOuvre(Utilisateur) au début afin de vérifier ton hypothèse mais le problème reste identique:la mémoire se sature...

Contribution le : 25/07/2005 15:20
Créer un fichier PDF de la contribution Imprimer


Re: Saturation mémoire
Animateur WDF
Inscrit:
26/06/2002 16:24
De wdforge.org
Post(s): 2822
Merci, j'avais pris soin de ne pas indiquer que la solution proposée était pratique
J'avoue sécher en l'état des choses... Peut être qu'en produisant un mini projet avec un seul fichier et une fenêtre avec un bouton ne contenant que le code incriminé et postant le tout au ST, il seraient en mesure de vous en dire plus... Evidement, dans votre demande, penser à aller à l'essentiel :
Action : ouvrir un filtre, ammorcer un parcours, liberer le filtre avant de recommenter.
Résultat : non libération mémoire sur serveur et dépassement.

J'imagine que le TANTQUE vrai est là pour simuler le trés grand nombre d'occurrence prévu...

Evidement, toute information de retour nous interesse.

Contribution le : 25/07/2005 15:32
_________________
R&B
Contact, CV.
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant
(1) 2 »




Enregistrer votre réponse
CompteNom   Mot de passe   Authentification
Message:


Vous ne pouvez pas débuter de nouveaux sujets.
Vous pouvez voir les sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Connexion
Menu
Chercher WDForge
Chercher Web
Partenaires
Visualiser tous les Partenaires...
WinDev, WebDev, WinDev Mobile et HyperFile sont des marques déposées par PCSoft. |  Voter |  Legal |  Contact |   XOOPS 2.0.13.2