Zarządzenie pamiecią i zmiennymi w LabView

Tematy związane z tworzeniem dużych aplikacji. Zaganiednia dotyczące architektury oraz zasad tworzenia optymalnych rozwiązań.
mippi
Posty: 7
Rejestracja: 06 lip 2009 14:36
Lokalizacja: Poza Polską
Kontakt:

Zarządzenie pamiecią i zmiennymi w LabView

Post autor: mippi »

Witam:),
mam pewien problem z aplikacją, którą właśnie rozbudowuję i niestety kompletnie nie wiem jak go rozwiązać, ani nawet gdzie dokładniej szukać rozwiązania.

Generalnie problem zdefiniowałbym jak zarządanie pamięcią i zmiennymi, a konkretnie ich usuwaniem. Pracuję nad dość dużej tablicy o wymiarach 64x64xok. 20000 liczb rzeczywistych (DBL), co teoretycznie daje ponad 80MB w pamięci. Jednak już po wczytaniu jej z pliku zużycie pamięci programie skacze o jakieś 300MB. To znacząco utrudnia pracę i tego dotyczą moje pytania:

1. Jeśli mam powyższą tablicę podłączam na wejście subVI, to czy program tworzy jej kopię i uruchamia subVI pracując na kopii, czy przekazuje adres i pracuje na tej samej zmiennej?
Powyższe pytanie wynika z faktu, że stworzyłem alternatywną wersję programu, która po odczytaniu przekazała całą tablicę do jednej kontroli i później przekazywałem wszędzie (również do subVI) tylko referencję do tej kontrolki, a już w samym subVI korzystając z Property Node odycztywałem wartości z tablicy. Niestety efekt wykorzystania pamięci był zbliżony. Czy zwykłe podłączenie zmiennej i przekazanie przez referencję czymś się różnią?

2. Troszkę poważniejszy problem. Mianowicie w subVI tworzona jest na podstawie tej tablicy inna tablica o zbliżonych rozmiarach, która następnie przekazywana jest na wykres. W trakcie wykonywania tego subVI drastycznie wzrasta użycie pamięci i niestety po jego zakończeniu nie spada, choć tablica jest przekazywana na wykres i więcej do niczego nie jest mi potrzebna. Czy istnieje jakiś sposób na zwolnienie obszaru pamięci zajmowanego przez tę tablicę wyjścią z subVI, po jej wyświetleniu na wykresie? Czy generalnie istnieje jakaś technika czyszczenia pamięci z danych nieużywanych już? Ewentualnie usuwania z pamięci wszystkich efektów działania danego subVI?

3. Na koniec mam jeszcze pytanie odnośnie Property Node oraz zmiennej lokalnej. Jaka jest różnica i jak lepiej odczytywać/zapisywać wartość do kontrolki, czy przez zmienną lokalną czy przez Property Node -> Value? Czym te dwa podejścia się różnią?

Z góry bardzo dziękuję za wszelkie odpowiedzi.

Serdecznie pozdrawiam
Awatar użytkownika
Nowszy
Posty: 504
Rejestracja: 30 maja 2008 08:33
Wersja środowiska: LabVIEW 2011
Lokalizacja: Katowice
Kontakt:

Zarządzenie pamiecią i zmiennymi w LabView

Post autor: Nowszy »

Ja tak na szybko podrzucę ci tylko kilka linków, które mogą pomóc:
How Can I Avoid Making Multiple Copies of a Large Array in Memory When Using a Functional Global?
How Can I Optimize the Memory Use in My LabVIEW VI?
Powyższe traktuj jako punkt startowy, na dole masz linki do innych przydatnych dokumentów.

Odpowiedź na 3. pytanie:
What is the Difference Between a Local Variable and a Value Property Node?
Pozdrawiam, Maciek Antonik
Edu4Industry
vugie
Posty: 383
Rejestracja: 17 lis 2006 00:00
Wersja środowiska: LabVIEW 2009
Lokalizacja: Warszawa

Zarządzenie pamiecią i zmiennymi w LabView

Post autor: vugie »

Pierwsze primo:
64*64*20000*8= ok. 650 MB

Drugie primo:
Pokaż kod, to łatwiej będzie znaleźć miejsca gdzie tworzy się kopia.
Tools->Profile->Show Buffer Allocations. Zaznacz tylko tablice i czarne kropki wskażą Ci miejsca gdzie MOGÄ„ się tworzyć kopie.
ZASADNICZO przekazywanie przez subVI nie tworzy kopii i ZASADNICZO jest to najlepszy sposób przekazywania danych.

Trzecie primo:
Zapisywanie przez property i local variable nie różnią się od siebie tak jak niektórzy chcieliby sądzić i są jednakowo złe. Dobrym sposobem jest natomiast Notifier lub Queue.

Czwarte primo:
Pamięć nie jest zwalniana po zakończeniu programu prawdopodobnie dlatego, że wszystkie dane nadal siędzą w kontrolce (o ile panel pozostaje otwarty). Najlepiej do kontrolki wizualizacyjnej przekazywać dane mocno okrojone, tyle tylko ile potrzeba, żeby powstał wykres - on i tak nie wyświetli się z rozdzielczością subpikselową.
mippi
Posty: 7
Rejestracja: 06 lip 2009 14:36
Lokalizacja: Poza Polską
Kontakt:

Re: Zarządzenie pamiecią i zmiennymi w LabView

Post autor: mippi »

W załączniku przesyłam kod, może ktoś coś poradzi, jak można to zoptymalizować pod względem użycia pamięci i gdzie namnażają się te dane. Przeczytałem w jednym z powyższych artykułów o konwersji, ale jak używam wszędzie DBL'a, to jest jeszcze gorzej niż z SGL'em.
A tak przy okazji, to czy da się zmusić funkcje typu FFT, żeby jak na wejściu mają SGL, to żeby na wyjściu też stosowały taki format?

Z góry dziękuję za pomoc.
vugie
Posty: 383
Rejestracja: 17 lis 2006 00:00
Wersja środowiska: LabVIEW 2009
Lokalizacja: Warszawa

Zarządzenie pamiecią i zmiennymi w LabView

Post autor: vugie »

ja niestety mam tylko 8.2
mippi
Posty: 7
Rejestracja: 06 lip 2009 14:36
Lokalizacja: Poza Polską
Kontakt:

Re: Zarządzenie pamiecią i zmiennymi w LabView

Post autor: mippi »

Nie ma problemu, konwersja do wersji 8.0:)
Gdzie niegdzie mogą być niemieckie napisy, bo niestety mam niemiecko języczną wersję LabView - koszmar:(

Pozdrawiam i dziękuję za pomoc
Awatar użytkownika
jogurt_owocowy
Posty: 1317
Rejestracja: 30 lis 2004 00:00
Wersja środowiska: LabVIEW 2015
Lokalizacja: Kraków

Re: Zarządzenie pamiecią i zmiennymi w LabView

Post autor: jogurt_owocowy »

Czy istnieje jakiś sposób na zwolnienie obszaru pamięci zajmowanego przez tę tablicę wyjścią z subVI, po jej wyświetleniu na wykresie?
Służy do tego funkcja Request Deallocation.
Dobry artykuł na temat zarządzania pamięcią znajdziesz TUTAJ.
vugie
Posty: 383
Rejestracja: 17 lis 2006 00:00
Wersja środowiska: LabVIEW 2009
Lokalizacja: Warszawa

Zarządzenie pamiecią i zmiennymi w LabView

Post autor: vugie »

W VI-jach tworzących wykresy masz kilkuramkowe case'y, które są bardzo podobne - w każdym jest podwójna pętla For, na wyjściu której jest trójwymiarowa tablica. Niech mnie ktoś poprawi jakby co, ale wydaje mi się, że w każdym case'ie tworzy się oddzielny bufor. Dużo efektywniej byłoby gdybyś miał te pętle na zewnątrz, a Case'a wrzucił do środka. Oczywiście wymaga to przeróbek reszty logiki VI-ja. Poza tym za każdym razem, w każdym z tych VI-ów wycinasz ten sam podzestaw z dużej tablicy (do index array prowadzą wartości odczytane z pliku i nigdzie nie zmieniane). Nie mógłbyś tego wyciąć zaraz na początku, po odczycie z pliku? Albo nawet w trakcie odczytu? Nawet jeżeli cała tablica jest do czegoś jeszcze potrzebna, to efektywniej będzie nie robić wiele razy tego samego.
ODPOWIEDZ