Obciążenie pamięci - duży problem

Tematy związane z tworzeniem dużych aplikacji. Zaganiednia dotyczące architektury oraz zasad tworzenia optymalnych rozwiązań.
Awatar użytkownika
wino
Posty: 549
Rejestracja: 23 gru 2005 00:00
Wersja środowiska: Nie mam LabVIEW
Lokalizacja: Kraków

Re: Obciążenie pamięci - duży problem

Post autor: wino »

A czy ty musisz wczytywać te wszystkie dane na raz? Nie możesz wczytać części, przetworzyć, wczytać kolejną, itd..?
mippii
Posty: 14
Rejestracja: 01 lut 2011 14:18
Wersja środowiska: LabVIEW 2009

Re: Obciążenie pamięci - duży problem

Post autor: mippii »

Niestety nie mogę, wszystkie dane muszą być w pamięci cały czas. Wiem, że to duży problem, ale wykonuję ciągle obliczenia na wszystkich tych danych, więc zrzucanie ich na dysk i odczytywanie jest oczywiście jak najbardziej możliwe, ale znacznie spowolni pracę programu. Z drugiej strony 400MB danych, to nie jest jakiś gigantyczny rozmiar, ale niestety LabView średnio sobie z tym radzi tworząc kopie kopii w każdym możliwym miejscu i to jest problem podstawowy, z którym do końca nie umiem sobie poradzić.

Swoją drogą, może ktoś mi jeszcze powie: w Case Structure tworzone są kopie wszystkich danych wejściowych i do każdej z opcji doprowadzana jest kopia. Czy tak samo jest w przypadku Event Structure?
Awatar użytkownika
wino
Posty: 549
Rejestracja: 23 gru 2005 00:00
Wersja środowiska: Nie mam LabVIEW
Lokalizacja: Kraków

Re: Obciążenie pamięci - duży problem

Post autor: wino »

Skoro tak, to skorzystaj ze struktury In Place szukaj w palecie Structures, jest ona specjalnie stworzona dla takich programów jak twój. Dzięki niej możesz zapobiec kopiowaniu danych Możesz też przekazywać dane przez referencje, a nie tak jak do tej pory w postaci klastra (obczaj se VI New Data Value Reference znajdziesz w palecie Application -> Memory Control ).

Dodatkowo we właściwościach VI ustawi, żeby był kompilowany z użyciem opcji Inline. To też zapobiegnie tworzeniu kolejnych kopii, które powstają na wejściach VI.
mippii
Posty: 14
Rejestracja: 01 lut 2011 14:18
Wersja środowiska: LabVIEW 2009

Obciążenie pamięci - duży problem

Post autor: mippii »

Zajrzałem do tych struktur i wygląda to tajemniczo, ale może jakoś dam radę. Masz może jakieś przykłady z użyciem tych struktur? Niestety nic nie mogę znaleźć a w manualu tak skromnie to opisali :(
A czy te opcje kompilacji inline dotyczą tylko skomplikowanego do exe programu czy też odpalanego z kodu źródłowego? W którym miejscu mogę znaleźć tę opcję?
PiDi
Posty: 641
Rejestracja: 31 gru 2010 01:36
Wersja środowiska: LabVIEW 2017
Lokalizacja: Katowice

Re: Obciążenie pamięci - duży problem

Post autor: PiDi »

smiga pisze:
PiDi pisze: - Jeszcze gorsza rzecz w przypadku tego klastra - pojawia się tam czerwona kropka, która zwiastuje nam konwersję danych i przy tym - utworzenie dodatkowego bufora na to działanie.
Tego nie byłbym taki pewny - kropka najpewniej wynika z faktu zapisu klastra jako Type Def, a niestety Labview ma zwyczaj takiego oznaczania (moim zdaniem wprowadzający troszkę zamieszania), gdy podajemy dane jakiekolwiek inne niż dokładnie taki sam zdefiniowany Type Def.
Posypuję głowę popiołem, faktycznie kropka oznacza tam tylko konwersje z zestawu danych "nietypowych" na "typowe" i nie pociąga żadnych dodatkowych konsekwencji.

Na marginesie: kropkę można zlikwidować, doprowadzając stałą tego (wyjściowego) typu do wejścia "cluster" bloczka Bundle
ObrazekObrazekObrazekObrazek
mippii
Posty: 14
Rejestracja: 01 lut 2011 14:18
Wersja środowiska: LabVIEW 2009

Obciążenie pamięci - duży problem

Post autor: mippii »

Przekopałem się przez strukture In Place oraz New Data Value Reference i zużycie pamięci jest dokładnie jak bez tych struktur. Może coś robię źle, może czegoś nie rozumiem, ale u mnie to nie działa niestety. Jeśli ktoś miałby jakiś działający przykład, na którym można zobaczyć istotną różnicę, to byłbym wdzieczny.
PiDi
Posty: 641
Rejestracja: 31 gru 2010 01:36
Wersja środowiska: LabVIEW 2017
Lokalizacja: Katowice

Re: Obciążenie pamięci - duży problem

Post autor: PiDi »

A mógłbyś dać jakiś przykładowy plik który wczytujesz?
ObrazekObrazekObrazekObrazek
Awatar użytkownika
smiga
Administrator
Posty: 799
Rejestracja: 04 paź 2009 12:41
Wersja środowiska: LabVIEW 2016
Lokalizacja: Słupsk

Re: Obciążenie pamięci - duży problem

Post autor: smiga »

Najlepiej wrzuć cały ten fragment kodu z przykładowym plikiem do obróbki (czyli VI główny i SubVI) to postaramy się to zoptymalizować.
__ Arkadiusz Śmigielski, tel. 662 01 01 74___
ObrazekObrazekObrazek
mippii
Posty: 14
Rejestracja: 01 lut 2011 14:18
Wersja środowiska: LabVIEW 2009

Re: Obciążenie pamięci - duży problem

Post autor: mippii »

Dzięki za pomoc i informacje. Udało mi się troszkę zmienić koncepcję programu tak, że czytam dany fragmentami z dysku. Niestety trwa do zdecydowanie dłużej, ale to była chyba jedyna szansa, żeby cokolwiek zrobić. Oj chyba chłopaków z National'a czeka długa droga i dużo pracy, aby skutecznie poprawić system obsługi pamięci, ale dajmy im szanse;)
Awatar użytkownika
smiga
Administrator
Posty: 799
Rejestracja: 04 paź 2009 12:41
Wersja środowiska: LabVIEW 2016
Lokalizacja: Słupsk

Re: Obciążenie pamięci - duży problem

Post autor: smiga »

Byłem na szkoleniu LabVIEW Performance - polecam.
Z tego co zauważyłem na szkoleniu wiem, że raczej większość rzeczy możesz naprawdę mocno zoptymalizować, a ograniczają nas jedynie umiejętności i wiedza. Na pewno da się przesyłać dane przez referencje i nie ma potrzeby robienia wielu kopii w pamięci. Na poziomie projektu (podejścia do architektury programu) i kodowania można też uniknąć wielu błędów. W wolniejszej chwili (może wieczorkiem) podeślę przykładowy kod pokazujący działanie np. In Place - będzie widać różnice.
__ Arkadiusz Śmigielski, tel. 662 01 01 74___
ObrazekObrazekObrazek
Awatar użytkownika
smiga
Administrator
Posty: 799
Rejestracja: 04 paź 2009 12:41
Wersja środowiska: LabVIEW 2016
Lokalizacja: Słupsk

Re: Obciążenie pamięci - duży problem

Post autor: smiga »

Załączam przykład ze szkolenia.
Po pierwsze możesz zaobserwować szybkość wykonywania się kodu zmieniając Test Selection.
Włącz sobie Profile Performance and Memory i zobacz użycie pamięci. Następnie kliknij prawym na jakąś strukturę In Place, a następnie Remove In Place Element Structure - odpal raz jeszcze i obserwuj zmiany zużycia pamięci.
LabView 2010 jest dość inteligentne i same sobie optymalizuje kod, więc nie zawsze widać różnicę. Kiedyś testowałem podobne rzeczy na wersji 8.6 - tam to ładnie było widać.
Mam nadzieję, że na 2009 będzie to widać.
Załączniki
ActionEngine.vi
v9.0
(21.13 KiB) Pobrany 371 razy
DataValueReference.vi
v9.0
(37.81 KiB) Pobrany 376 razy
__ Arkadiusz Śmigielski, tel. 662 01 01 74___
ObrazekObrazekObrazek
ODPOWIEDZ