Błąd niewystarczającej ilości pamięci

Tematy związane z tworzeniem dużych aplikacji. Zaganiednia dotyczące architektury oraz zasad tworzenia optymalnych rozwiązań.
zuro
Posty: 3
Rejestracja: 01 paź 2013 13:16
Wersja środowiska: LabVIEW 2009

Błąd niewystarczającej ilości pamięci

Post autor: zuro »

Witam,

Jak w temacie mam problem z niewystarczającą ilością pamięci podczas wykonywanych obliczeń. Operuję na dużych plikach, które zajmują średnio po 15-20 MB. W jednym pliku znajdują się dane w trzech kolumnach po kilka milionów wierszy. Obliczenia są powtarzane dla 8 plików. Problem występuje w miejscu wykorzystania funkcji Basic DC/RMS i Amplitude and Levels. Próbowałem podzielić etapy liczenia przez Flat Sequence Structure, ale w dalszym ciągu program kończy w ten sam sposób: Not enough memory. Zaznaczam, że dla jednego pliku obliczenia dochodzą do końca.

Moje pytanie brzmi czy istnieje możliwość wyczyszczenia pamięci po wykorzystaniu funkcji Basic DC/RMS i Amplitude Levels? De facto po wczytaniu danych uzyskuję z nich tylko kilka wartości.

Wykorzystuję Labview 2009. Mój komputer ma 4 GB ramu oraz C2D 3GHz na procku. Będę wdzięczny za pomoc!

Pozdrawiam!
Awatar użytkownika
Pitol
Moderator
Posty: 982
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Kraków

Błąd niewystarczającej ilości pamięci

Post autor: Pitol »

Wrzuć kod, bo niewiele możemy pomóc bez tego.
ObrazekObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj
Awatar użytkownika
Harnas
Posty: 152
Rejestracja: 16 mar 2011 09:56
Wersja środowiska: LabVIEW 2009

Błąd niewystarczającej ilości pamięci

Post autor: Harnas »

Przypuszczalnie otwierasz caly plik za jednym zamachem i LabVIEW nie daje sobie z tym rady z przetworzeniem takiej liczby wierszy. Mialem podobne problemy. Polecalbym czytanie za pomoca petli FOR jednego wiersza, wykonywania na nim obliczen, ponownego zapisywania czy co tam wolisz a nastepnie czytania kolejnego wiersza.
zuro
Posty: 3
Rejestracja: 01 paź 2013 13:16
Wersja środowiska: LabVIEW 2009

Błąd niewystarczającej ilości pamięci

Post autor: zuro »

@Pitol:
Postaram się wrzucić strukturę programu jeszcze dzisiaj.

@Harnas:
Tak, otwieram wszystkie pliki za jednym zamachem. Nie wykonuje natomiast obliczeń na każdym wierszu. Potrzebuję wyciągnąć pojedynczą informację z całego zestawu danych. Przykładowo: chcę uzyskać informację na temat min i max funkcji, której wartości mam w plikach. Nie bardzo chcę wykorzystywać pętle for kiedy mam dostępne istniejące funkcje.
Awatar użytkownika
Harnas
Posty: 152
Rejestracja: 16 mar 2011 09:56
Wersja środowiska: LabVIEW 2009

Błąd niewystarczającej ilości pamięci

Post autor: Harnas »

No to czekamy na kod programu.
Ps. Min i max tez mozesz za pomoca petli for i czytania wiersza po wierszu zrealizowac.
zuro
Posty: 3
Rejestracja: 01 paź 2013 13:16
Wersja środowiska: LabVIEW 2009

Re: Błąd niewystarczającej ilości pamięci

Post autor: zuro »

W załączniku znajduje się program. Miejsce, w którym wysypuje się program znajduje się w Flat Sequence Structure. Miałem nadzieję, że jeżeli będę wyznaczać te wartości w ustalonej kolejności to program sam będzie czyścić pamięć.

ps. Proszę o tolerancję ;) Niedawno zacząłem zajmować się tym programem.
Załączniki
analizy_moja_v.2.vi
(1.82 MiB) Pobrany 367 razy
Awatar użytkownika
Trint
Posty: 14
Rejestracja: 22 paź 2012 14:10
Wersja środowiska: LabVIEW 2012

Re: Błąd niewystarczającej ilości pamięci

Post autor: Trint »

O zarządzaniu pamięcią w LabVIEW dużo by mówić. W zasadzie jakakolwiek alokacja dzieje się automatycznie, więc czasem trudno ogarnąć, jak, gdzie i czemu dane są kopiowane (w Helpie powinien być obszerny temat Memory Usage). Ale rozwiązywanie problemu zacząłbym od ulepszenia kodu, bo tu chyba właśnie pies pogrzebany... Po kolei:
1. Kopiowanie dużej części kodu jest, przepraszam za nadmiar szczerości, karygodne. Po to wymyślono pętle. Zamiast kilku kontrolek tego samego typu, lepiej użyć tablicy jako wejścia do pętli FOR, stworzonej właśnie do obsługi tablic. Zawartość tej pętli to kod, który ma wykonać się N razy.
2. Zmienne lokalne powodują kopiowanie danych, między innymi dlatego odradza się ich stosowanie, zwłaszcza tam, gdzie tych danych może być sporo.
3. Używasz bloczka Replace Array Subset do umieszczenia wyników obliczeń w tablicy, ale za każdym razem w tym samym miejscu tablicy (zerowej kolumnie) - nadpisujesz wyniki kolejnymi wynikami. Chyba lepiej byłoby użyć samej pętli FOR do tworzenia tablicy 2D.
4. Nie widzę potrzeby, żeby inicjalizować tablicę zerami za każdym razem, a wyciąganie poszczególnych kolumn można zrobić po prostu za pętlą. W ten sposób zmiennych lokalnych nie ma w ogóle, a Stacked Sequence robi się zbędne.

Uporządkowałem twój kod, napisz, czy coś pomogło.
Załączniki
analizy_poprawka.vi
(199.26 KiB) Pobrany 346 razy
ODPOWIEDZ