Strona 1 z 1

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

: 04 paź 2013 14:00
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!

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

: 05 paź 2013 21:18
autor: Pitol
Wrzuć kod, bo niewiele możemy pomóc bez tego.

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

: 06 paź 2013 14:11
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.

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

: 07 paź 2013 11:42
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.

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

: 07 paź 2013 13:00
autor: Harnas
No to czekamy na kod programu.
Ps. Min i max tez mozesz za pomoca petli for i czytania wiersza po wierszu zrealizowac.

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

: 07 paź 2013 15:55
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.

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

: 08 paź 2013 00:29
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.