PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2024 → Mémoire vive restante en WinDev
Mémoire vive restante en WinDev
Iniciado por Christian, 16,oct. 2017 10:37 - 15 respuestas
Miembro registrado
18 mensajes
Popularité : +2 (2 votes)
Publicado el 16,octubre 2017 - 10:37
Bonjour,

J'ai un programme qui utilise beaucoup de mémoire vive (création de vues) pour des calculs mathématiques matriciels sur de grosses bases de données sur disque dur.
Avec les nouveaux ordi portables il n'y a pas assez de mémoire vive et le programme les fait ramer au point de figer l'affichage.
Y a-t-il une instruction Windev (ou autre) qui permet de connaître la mémoire vive restante afin que je bascule mes vues sur disque dur afin de ne pas saturer la mémoire ?

J'ai beau interroger l'aide, les FAQ et le forum : pas d'infos sur la mémoire vive restante, soit en exécution, soit au démarrage du programme..

Merci de vos réponses
Christian
Miembro registrado
948 mensajes
Popularité : +30 (92 votes)
Publicado el 16,octubre 2017 - 11:11
Coucou,

Deux solutions :

1) tu passe via l'utilitaire Windows: tasklist
Displays a list of applications and services with their Process ID (PID) for all tasks running on either a local 
or a remote computer.

https://technet.microsoft.com/en-us/library/bb491010.aspx


2) Tu passe via DotNet - Process.WorkingSet64 Property <- Je préfere bien utiliser un code DotNet plutot que tasklist ^^
This property can be used to monitor memory usage on computers with 32-bit processors or 64-bit processors. The property value is equivalent to the Working Set performance counter for the process.

https://msdn.microsoft.com/en-us/library/system.diagnostics.process.workingset64(v=vs.110).aspx


Je comprend bien que ton operations consome énormement de mémoire, mais tu est sur que tu n'as pas de fuite de mémoire ?

--
Charly CanDo - In üs we trust - #92i
Do. Or do not. There is no try - #y0d4

(#Compétence & #rapidité & #implication & #references) > #PasDeCV
Je suis disponible pour du consulting Windev (#debug #Optimization #System #Etc)
Mensaje modificado, 16,octubre 2017 - 11:18
Miembro registrado
326 mensajes
Popularité : +15 (19 votes)
Publicado el 16,octubre 2017 - 12:14
Bonjour.
La gestion de la mémoire se fait par l'OS qui "swap" sur le DD quand il le faut. Le "SWAP" arrive bien avant la consommation "totale" de la RAM, cela dépend de la RAM totale bien entendu, mais aussi des autres programmes qui sont en occupation mémoire... Je ne sais donc pas comment tu déciderais de "basculer" test vues.
Je ne vois pas ce que tu entends par "figé" : est-ce seulement le programme (voir alors du côté de "fenêtrerepeint" ou "multitacherepeint") ou tout le poste ? Dans ce dernier cas, il faudrait peut-être revoir le traitement pour écrire au plus tôt sur le DD des données d'étapes intermédiaires (perte de vitesse mais gain de mémoire !).
Bon courage.

Michel.
Miembro registrado
18 mensajes
Popularité : +2 (2 votes)
Publicado el 16,octubre 2017 - 17:01
Merci de cette réponse. Je vais plutôt passer par DotNet. Cela répond à ma demande.
Miembro registrado
948 mensajes
Popularité : +30 (92 votes)
Publicado el 16,octubre 2017 - 17:19
Coucou,

Ok si t'as un soucis pour l'implementer tu repost et on en discute ^^

--
Charly CanDo - In üs we trust - #92i
Do. Or do not. There is no try - #y0d4

(#Compétence & #rapidité & #implication & #references) > #PasDeCV
Je suis disponible pour du consulting Windev (#debug #Optimization #System #Etc)
Miembro registrado
18 mensajes
Popularité : +2 (2 votes)
Publicado el 16,octubre 2017 - 17:20
Merci de la réponse.
Ben oui, normalement cela swap. Mais il n'empêche que le programme rame sérieusement au bout d'un moment : les fenêtres ne se fermement plus, le déplacement des fenêtres n'effacent pas la position précédente, les calculs deviennent interminables etc. Il faut fermer le programme et le rouvrir. Et cela ne le fait que sur de petits ordis. J'ai traqué les oublis de HdétruitVue mais rien n'y fait.
Bon, j'ai eu une réponse : passer par Process.WorkingSet64 Property
Miembro registrado
18 mensajes
Popularité : +2 (2 votes)
Publicado el 16,octubre 2017 - 17:26
Depuis ce matin, en attendant une réponse, j'ai eu temps de fouiner en profondeur dans la doc Windev (qui est plutôt mal foutue sur ce coup). J'ai mis deux heures à la trouver : Il semble que l'instruction SysEspace(sysespaceProgrammelibre) remplisse cette fonction ? Qu'en penses-tu?
Cela pourrait servir à quelqu'un!
Miembro registrado
948 mensajes
Popularité : +30 (92 votes)
Publicado el 16,octubre 2017 - 17:53
Coucou,

C'est une bonne idée sa ;)

Tu peut essayer de faire un appelle sur ce morceau de code aussi sa te libéreras un peu de ressources

SI SysVersionWindows(sysVersionPlateForme) = "NT" ALORS
API("psapi","EmptyWorkingSet", API("Kernel32","GetCurrentProcess"))
FIN


Tu partages, je partages ;)

--
Charly CanDo - In üs we trust - #92i
Do. Or do not. There is no try - #y0d4

(#Compétence & #rapidité & #implication & #references) > #PasDeCV
Je suis disponible pour du consulting Windev (#debug #Optimization #System #Etc)
Miembro registrado
326 mensajes
Popularité : +15 (19 votes)
Publicado el 16,octubre 2017 - 18:36
Re Bonjour.
Je crois que le problème n'est pas dans la gestion de la mémoire mais dans tes traitements. Si je ne me trompe pas tu utilises hdetruitvue qui est une fonction qui s'utilise sur les vues avant la version 20 -> c'est l'équivalent d'une requête exécutée sur le poste client (je n'ai jamais trop compris pourquoi ils ont appelé cela une vue car ce n'est rien d'autre qu'une requête gérée comme un fichier HF à certains moments et comme une requête à d'autres).
Il y a depuis la version 20 ce que PCSOFT appelle vue matérialisée qui s'apparente bien plus à une vue de base de données autre que HF (ORACLE , SQLServer ...). Voir la documentation "vue matérialisée" -> cela correspondrait plus à ton traitement non ?
Pour info je n'ai jamais utilisé ce style de vue (version avant la 20 !). Merci de nous dire quel type de vue tu utilises ?
Michel
Publicado el 17,octubre 2017 - 14:57
Oui, je programme depuis longtemps et j'utilise WinDev depuis le début -> J'ai conservé l'ancien code.
Ceci dit, les vues matérialisées sont sur DD et sont beaucoup moins rapide que les Vues en mémoire vive. C'est pour cela que je les ai conservées. Mais depuis l'apparition des ordi portables à peu de mémoire, il faut que je change de stratégie...
Mais en attendant de recoder je cherche une combine. Il semble que j'ai trouvé.
Merci de ta réponse :merci:
Publicado el 17,octubre 2017 - 14:59
Merci du code! Vive l’entraide
Christian
Publicado el 17,octubre 2017 - 16:01
Le 16/10/2017 à 08:37, Christian a écrit :
Bonjour,

J'ai un programme qui utilise beaucoup de mémoire vive (création de
vues) pour des calculs mathématiques matriciels sur de grosses bases de
données sur disque dur.
Avec les nouveaux ordi portables il n'y a pas assez de mémoire vive et
le programme les fait ramer au point de figer l'affichage.
Y a-t-il une instruction Windev (ou autre) qui permet de connaître la
mémoire vive restante afin que je bascule mes vues sur disque dur afin
de ne pas saturer la mémoire ?

J'ai beau interroger l'aide, les FAQ et le forum : pas d'infos sur la
mémoire vive restante, soit en exécution, soit au démarrage du programme..

Merci de vos réponses
Christian

Salut Christian,
Pour ma part je fais ceci pour avoir la RAM encore disponible
NSysespaceProgramme est un entier sur 8 octets=
SysEspace(sysEspaceProgramme)
nSysEspaceProgrammeLibre est un entier sur 8 octets=
SysEspace(sysEspaceProgrammeLibre)
dDate est une Date

CaseMessage5 = DateVersJourEnLettre(dDate) + " " + dDate..Jour + " " +
DateVersMoisEnLettre(dDate) + " " + dDate..Année + " " +
Gauche(HeureVersChaîne((Maintenant())),5)




//nSysespaceStockage est un entier système = SysEspace(sysespaceStockage)
//nSysespaceStockageLibre est un entier système =
SysEspace(sysespaceStockagelibre)

maPhrase est une chaîne = ""
maPhrase += "Espace mémoire physique Disponible : " +
NumériqueVersChaîne(NSysespaceProgramme , "+30,0fS")+ " KB "
maPhrase+= " Espace mémoire physique libre : " +
NumériqueVersChaîne(nSysEspaceProgrammeLibre , "+30,0fS") +" KB "
CaseMessage2 = maPhrase
BOn windev
Miembro registrado
18 mensajes
Popularité : +2 (2 votes)
Publicado el 17,octubre 2017 - 22:27
Salut Marcel,

Merci de ta réponse.
Entretemps, en fouillant bien, -et longtemps, j'avais trouvé l'instruction sysEspace. La recherche dans la doc WinDev n'a pas de mot clé RAM, ni mémoire vive, ni mémoire restante ...
J'ai dû chercher un bout de temps avant de trouver.
Mais merci de ton exemple. En retour peut être connais tu l'instruction qui convertit les octets en ce que l'on veut : ko, Mo, Giga :
C'est
TailleVersChaîne(numérique,format affichage)

C'est pour le moins mal nommé ... OctetVersChaîne aurait été beaucoup plus explicite ....
Christian
Publicado el 18,octubre 2017 - 08:18
Le 17/10/2017 à 20:27, Christian a écrit :
Salut Marcel,

Merci de ta réponse.
Entretemps, en fouillant bien, -et longtemps, j'avais trouvé
l'instruction sysEspace. La recherche dans la doc WinDev n'a pas de mot
clé RAM, ni mémoire vive, ni mémoire restante ...
J'ai dû chercher un bout de temps avant de trouver.
Mais merci de ton exemple. En retour peut être connais tu l'instruction
qui convertit les octets en ce que l'on veut : ko, Mo, Giga :
C'est
TailleVersChaine(numérique,format affichage)

C'est pour le moins mal nommé ... OctetVersChaîne aurait été beaucoup
plus explicite ....
Christian


nTaille est un réel = pnTaille
sTaille est une chaîne

SELON Vrai
CAS nTaille<1024
sTaille = nTaille+" "+"octets"
CAS 1024<=nTaille<1024*1024
nTaille = nTaille/1024
sTaille = NumériqueVersChaîne(nTaille,",0f") +" "+"Kb"
CAS 1024*1024<=nTaille<1024*1024*1024
nTaille = nTaille/1024/1024
sTaille = NumériqueVersChaîne(nTaille,",0f") +" "+"Mb"
CAS 1024*1024*1024<=nTaille<1024*1024*1024*1024
nTaille = nTaille/1024/1024
sTaille = NumériqueVersChaîne(nTaille,",0f") +" "+"Gb"
FIN

RENVOYER sTaille

Marcel
BOn WIndev
Miembro registrado
18 mensajes
Popularité : +2 (2 votes)
Publicado el 19,octubre 2017 - 10:49
J'ai essayé l'API : cela grappille bien quelques Ko. Toujours cela de pris.
Merci
Miembro registrado
948 mensajes
Popularité : +30 (92 votes)
Publicado el 19,octubre 2017 - 11:26
Coucou,

Pas + ? je suis surpris ...
Si tu reste avec ton problème, et que tu peut assumer les cout d'un consulting j suis intéresser pour regarder ce que je peut améliorer, après si j'améliore pas, c'est gratos ^^

C'est pas l’objet de ta demande, mais au cas ou ^^

--
Charly CanDo - In üs we trust - #92i
Do. Or do not. There is no try - #y0d4

(#Compétence & #rapidité & #implication & #references) > #PasDeCV
Je suis disponible pour du consulting Windev (#debug #Optimization #System #Etc)
Mensaje modificado, 19,octubre 2017 - 11:27