From Friday, April 19th (11:00 PM CDT) through Saturday, April 20th (2:00 PM CDT), 2024, ni.com will undergo system upgrades that may result in temporary service interruption.

We appreciate your patience as we improve our online experience.

Discussions au sujet de NI LabVIEW

annuler
Affichage des résultats de 
Rechercher plutôt 
Vouliez-vous dire : 

Message erreur mémoire

Bonjour à tous,

 

Je suis sur un projet de traitement de données post acquisitions (vidéos thermiques).

Pour ces traitements j'utilise des fonctions demandant l'intégralité de la vidéo comme données (par exemple traitement SVD).

Mon problème est que quand on traite une vidéo importante (plusieurs Go) alors le programme sature en mémoire et je me retrouve avec le fameux message "la mémoire est pleine" et le programme se coupe sauvagement.

Forcément ça arrive plus ou moins vite selon les performances du PC, les logiciels ouverts, etc.

 

J'ai donc deux questions :

  1. est ce qu'il est possible que ce message apparaisse mais sans couper violemment le logiciel ? Qu'on puisse récupérer l'info d'erreur et qu'on annule le traitement si besoin sans tout avorter.
  2. est ce qu'il est possible de prévenir ce type d'erreur en contrôlant la mémoire utilisée ? Je surveille les niveaux mémoires mais je ne sais pas quels données et seuils utiliser pour stopper (utilisation des fonction de Psapi.dll)

Merci par avance.

Cordialement,

Julien V.

[FIRST]

[LabVIEW Programming]


[FIRST]

0 Compliments
Message 1 sur 17
3 747 Visites

Bonjour,

 

Je me permets un petit up du sujet.

 

Cordialement,

Julien V.

[FIRST]

[LabVIEW Programming]


[FIRST]

0 Compliments
Message 2 sur 17
3 661 Visites

Bonjour Julien,

De mémoire non il n'est pas possible de récupérer de cette erreur de mémoire. Elle est interne à LV, et requiert de tout stopper.

Par contre tu peux surement la prévenir. Plutot que d'utiliser les fonctions de PSApli.dll, ne peux tu pas estimer la quantité de mémoire nécessaire pour traiter ta vidéo ? Cela permettrait de ne pas commencer un calcul si tu risques de saturer la mémoire.

Je ne suis pas un expert en traitement d'images, mais l'algorithme SVD ne peut-il pas être effectué sur des parties distinctes de la video ? Par exemple, chaque chunck de video produisant des résultats, et l'aggrégation des resultats pouvant être retraité pour un avoir un résultat correct comme si il avait été calculé sur la video entiere.

CLA, CTA, LV Champion
View Cyril Gambini's profile on LinkedIn
This post is made under CC BY 4.0 DEED licensing
0 Compliments
Message 3 sur 17
3 598 Visites

Bonsoir zyl7,

 

Merci de ton retour.

 

Pour le message d'erreur je me disais bien que ça n'était pas possible mais bon, qui sait ...

 

Pour ce qui est de tronquer les fonctions et d'assembler à nouveau le résultat, ça n'est pas probant. Je prends l'exemple du SVD car c'est typiquement le genre de fonction qui ne donnera pas les mêmes résultats si tu as tronqué la vidéo en plusieurs parties et assemblé les résultats ou traité toute la vidéo d'un coup.

Du coup pas trop le choix, je dois considérer le pire des cas et prendre toute la vidéo.

 

Sinon pour l'évaluation de la mémoire avant le traitement c'est déjà ce que je fais :

 - j'évalue la taille mémoire utilisée (souvent c'est la taille de la vidéo, en tableau 3D de double)

 - j'évalue la mémoire vive restante (j'utilise psapli.dll)

 - je pondère cette mémoire sur 5% (valeur prise au hasard d'essais) car LV utilise uniquement de la mémoire libre contiguë

 - si cette valeur est trop faible, je refuse le calcul

Ça marche très bien dans 80% des cas, car 5% de mémoire vive c'est souvent d'un bloc, mais pas tout le temps !

Et j'aimerai que ce soit du 100% fiable ... et c'est là où mes capacités me limites.

 

Cordialement,

Julien V.

[FIRST]

[LabVIEW Programming]


[FIRST]

0 Compliments
Message 4 sur 17
3 596 Visites

Le messages d'erreur que tu as posté mentionne la primitive "build array" (contruire un tableau).

 

De manière générale, quand un code explose la mèmoire, une des première chose que je fais c'est de faire une recherche de toutes les utilisations de la primitive "build array", une utilisation maladroite de cette fonction dans un algo peut vite entraîner des dérives de la mémoire, parfois corriger ce type de bug est rapide.

Ce n'est peut être pas ton cas, mais peux tu poster ton code?


We have two ears and one mouth so that we can listen twice as much as we speak.

Epictetus

Antoine Chalons

0 Compliments
Message 5 sur 17
3 540 Visites

Salut,

 

Je suis actuellement en déplacement à l'étranger, je n'ai pas le PC voulu sous la main.

Je fais ça la semaine prochaine dès que je rentre au bureau.

Par contre je ne peux pas filer le code, donc ce sera du screenshot.

 

A++

Cordialement,

Julien V.

[FIRST]

[LabVIEW Programming]


[FIRST]

0 Compliments
Message 6 sur 17
3 530 Visites

Salut,

 

Voici une copie d'écran de mon code (accessible en PJ).

Si ça doit planter c'est dans la partie 2.

 

Memory.JPG

 

 

Cordialement,

Julien V.

[FIRST]

[LabVIEW Programming]


[FIRST]

0 Compliments
Message 7 sur 17
3 492 Visites

Si je me réfère à ce que tu as dit dans ton premier message, tu traites une vidéo qui peut faire plusieurs Go.

 

Ta boucle FOR à une sortie indexée, je pense que le soucis est là.

Au niveau de cette sortie, tu empiles les résultats du calcul que tu fais sur chaque frame, je pense que c'est là que tu dois modifier qlq chose.

Ton traitement (3) dois venir à l'intérieur de la boucle de manière à supprimer la sortie indexée.

 

Good luck


We have two ears and one mouth so that we can listen twice as much as we speak.

Epictetus

Antoine Chalons

0 Compliments
Message 8 sur 17
3 482 Visites

Salut,

 

Ouais c'est tout à fait ça !

Mais comme indiqué dans un des messages, si je fais des portions de vidéos puis que j'assemble le résultat des calculs, ça ne donne pas la même chose que si j'envoie la vidéo complète en entrée.

Faire des portions n'est pas faisable du coup.

 

Merci quand même.

 

A++

Cordialement,

Julien V.

[FIRST]

[LabVIEW Programming]


[FIRST]

0 Compliments
Message 9 sur 17
3 449 Visites

Si je me fie à l'icone du VI dans ta boucle FOR, il charge image par image.

 

Je pense donc qu'il est possible de modifier ton code pour qu'il puisse fonctionner sans nécessiter une quantité de RAM proportionnelle à la taille de ta vidéo.


We have two ears and one mouth so that we can listen twice as much as we speak.

Epictetus

Antoine Chalons

0 Compliments
Message 10 sur 17
3 437 Visites