2013-01-03 6 views
12

Tytuł mówi wszystko.Natychmiast zatrzymaj MATLAB, jeśli użycie pamięci RAM przekroczy określoną wartość. Czy istnieje sposób?

Zasadniczo mam już dość konieczności resetowania mojego komputera za każdym razem, gdy błędnie sprawię, że MATLAB użyje dużej ilości pamięci RAM do symulacji z wieloma parametrami, które tworzę.

Czy istnieje sposób, aby go zatrzymać/błąd, jeśli użycie pamięci RAM zaczyna przekraczać określony procent mojej całkowitej pamięci RAM?

Wiem, że umieszczam try/catches wszędzie tam, gdzie przydzielam pamięć, ale to jest dla programu, który jest już napisany, a także, dla przyszłego odniesienia, chcę być w stanie po prostu ustawić parametr na początku i skończyć z tym.

Czy istnieje sposób?

Dzięki!

Odpowiedz

7

Problem pojawia się, gdy Matlab zaczyna korzystać z pamięci wirtualnej. Zwykle powinieneś zabić proces Matlaba za pomocą Menedżera zadań, ale nie zawsze jest to pożądane. Nie ma prostego wewnętrznego przełącznika Matlab, który, niestety, na całym świecie ograniczy maksymalny rozmiar tablicy.

Co zrobić, aby rozmiar pliku wymiany był bardzo mały, aby program Matlab nie mógł go w rzeczywistości dużo zapisać, ale może to z kolei wpłynąć na wydajność innych programów. Inne rozwiązania, inne niż Matlab, to przejście na Linuksa (gdzie można łatwiej ustawić ograniczenia pamięci dla programu, patrz odpowiedź @ BenVoigt na szczegóły na temat setting limits on both Windows and Linux) lub uruchomić wszystko na maszynie wirtualnej.

Na przyszłość, w moich symulacjach, mam metodę (podfunkcje, jeśli nie chcesz tego robić OOP) na początku mojej wstępnej alokacji, która oblicza szacunkowe całkowite wykorzystanie pamięci z uwzględnieniem parametrów symulacji (# elementów wszystkich dużych tablic Używam razy 8 dla podwójnych jest pamięcią w bajtach), a to rzuca błąd, gdy używałby zbyt dużo pamięci RAM.

Oto przykład szybkiej kontroli pamięci. Wiem, że zamierzam przydzielić tablice 3 m-by-by-t-t i tablice 5 m-by-t, wszystkie są podwójne.

maxMemFrac = 0.8; %# I want to use at most 80% of the available memory 

numElements = 3 * (m * 3 * t) + 5 * (m * t); 
numBytesNeeded = numElements * 8; %# I use double 

%# read available memory 
[~,memStats] = memory; 

if numBytesNeeded > memStats.PhysicalMemory.Available * maxMemFrac 
    error('MYSIM:OUTOFMEMORY','too much memory would be needed') 
end 
+0

Jonas, dzięki za odpowiedzi, które można opisać bardziej szczegółowo, jak robicie/korzystania z RAM-kalkulatora metody tutaj? Myślę, że będzie to praktyczne rozwiązanie, jeśli będę mógł z niego korzystać. Dzięki. – Spacey

+0

Przełącz na system Linux? Z tego, co wiemy, mógł już używać Linuksa. –

+0

@BenVoigt Jestem na maszynie Windows, nie sądzę, przejście na Lunix może być wykonalne dla mnie teraz. – Spacey

8

Można ustawić przydział pamięci wirtualnej dla grupy procesowej. W systemie Windows użyj obiektu Job. Włącz * nix użyj ulimit. Działa to z każdym procesem, a nie tylko z MatLab.

Zobacz

+0

Czy obiekt zadania umożliwia tworzenie limitów tylko dla bieżących procesów, czy też może współpracować z dowolnymi przyszłymi instancjami? – Jonas

+2

@ Jonas: Działa na dowolnych procesach dodawanych do obiektu zadania.Nie jest trwały w pliku wykonywalnym, jeśli o to ci chodzi, ale zawsze możesz napisać (lub pobrać, jestem pewien, że ktoś już napisał coś takiego) mały program uruchamiający, aby skonfigurować obiekt zadania i uruchomić instancję MatLab w tej pracy. –

+0

Dzięki za wyjaśnienie. Naprawię moją odpowiedź. (+1 przy okazji). – Jonas