Zarządzenie pamiecią i zmiennymi w LabView
Zarządzenie pamiecią i zmiennymi w LabView
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
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
- Nowszy
- Posty: 504
- Rejestracja: 30 maja 2008 08:33
- Wersja środowiska: LabVIEW 2011
- Lokalizacja: Katowice
- Kontakt:
Zarządzenie pamiecią i zmiennymi w LabView
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?
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
Edu4Industry
-
- Posty: 383
- Rejestracja: 17 lis 2006 00:00
- Wersja środowiska: LabVIEW 2009
- Lokalizacja: Warszawa
Zarządzenie pamiecią i zmiennymi w LabView
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ą.
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ą.
Re: Zarządzenie pamiecią i zmiennymi w LabView
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.
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.
-
- Posty: 383
- Rejestracja: 17 lis 2006 00:00
- Wersja środowiska: LabVIEW 2009
- Lokalizacja: Warszawa
Zarządzenie pamiecią i zmiennymi w LabView
ja niestety mam tylko 8.2
Re: Zarządzenie pamiecią i zmiennymi w LabView
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
Gdzie niegdzie mogą być niemieckie napisy, bo niestety mam niemiecko języczną wersję LabView - koszmar:(
Pozdrawiam i dziękuję za pomoc
- 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
Służy do tego funkcja Request Deallocation.Czy istnieje jakiś sposób na zwolnienie obszaru pamięci zajmowanego przez tę tablicę wyjścią z subVI, po jej wyświetleniu na wykresie?
Dobry artykuł na temat zarządzania pamięcią znajdziesz TUTAJ.
-
- Posty: 383
- Rejestracja: 17 lis 2006 00:00
- Wersja środowiska: LabVIEW 2009
- Lokalizacja: Warszawa
Zarządzenie pamiecią i zmiennymi w LabView
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.