2013-02-12 2 views
3

최근 Matlab의 OOP를 사용하여 일부 코드를 작성했습니다. 각 클래스 객체에서 일부 측정 데이터를 속성으로 저장하고이를 평가하는 방법을 정의합니다. 평균 데이터 세트를 사용하면 하나의 단일 클래스 객체가 약 32MB의 메모리를 사용합니다. 이제 이러한 객체를 처리해야하는 GUI를 작성하고 있습니다.Matlab : 클래스 객체의 사용 가능한 메모리가 없습니다.

첫 번째 단계에서는 저장된 .mat 파일 (약 200 개 개체, 하드 디스크의 2GB)에서 개체 집합을로드하고이를 handles 구조체에 저장합니다. RAM을 가득 채우고로드 할 때 약 6-7GB를 사용합니다. 이것은 아무런 문제가되지 않습니다.

그러나 GUI를 닫으면 사용 된 메모리를 확보 할 수없는 것으로 보입니다. 나는 성공하지 못한 다른 접근법을 시도했다. figure_CloseRequestFcn에서 무료 시도

function delete(obj) 
    obj.timeVector = []; 
    obj.valueVector = []; 
end 

:

클래스의 소멸자에 데이터 필드에 "빈"을 설정

function figure_CloseRequestFcn(hObject, eventdata, handles) 
    handles.data = []; 
    handles = rmfield(handles,'data'); 
    guidata(hObject,handles); 
    clear handles; 
    pack; %Matlab issues a warning, that pack could only 
      %be used from the command line, but that did 
      %not work either 
    delete(hObject); 
end 

어떤 아이디어, 후 matlab에 매일 마감 시간 외에 GUI로 작업 하시겠습니까?

+0

메모리가 여전히 차단되어 있고 사용 중이라고 표시되지 않았습니까? 그래서 정상적인 메모리를 사용한다면, 당신은 다 떨어질 것입니까? 게다가 나는 '모두 깨끗하게'만 생각할 수 있었지만 너무 많은 희망을 품지는 않았다. –

+0

그래서 Matlab에 의해 예약되어 있다고 가정합니다. 그러나 다른 프로그램에 더 많은 RAM이 필요한 경우 Matlab에서 무료로 설정합니까? GUI를 종료하고 다른 RAM을 많이 사용하는 프로그램을 시작하려고 시도한 후 Matlab은 예약 된 메모리 중 일부를 무료로 설정 한 것으로 보입니다 (링크 참조). 방금 GUI/스크립트/함수가 종료 된 후에 Matlab의 메모리 사용량이 정상 "유휴"사용량으로 떨어지기 때문에 혼란 스러웠습니다. http://i.stack.imgur.com/zWrcu.png – idono

+0

GUI를 사용하기 전, 도중, 사용한 후에'memory' 명령의 결과는 무엇입니까? – Pursuit

답변

2

나는 Matlab 버그 보고서 센터에서 대답을 찾았습니다. R2011b 이후로 존재합니다. 클래스의 인스턴스를 저장 한 후에

설명

클리어되는 객체 클래스를 메모리 누출을 야기하고 예방할 수 MAT-파일 객체를 포함

요약

' MyClass '가 클래스 파일을 호출하면 경고 메시지가 나타날 수 있습니다.

경고 :'MyClass '클래스의 객체 있다. 이 클래스 또는 상위 클래스를 지울 수 없습니다.

이 경고는 작업 영역에서 클래스의 모든 인스턴스를 지우더라도 계속 유지됩니다. 경고는 하나의 MAT 파일 형식에서 발생하며 다른 형식에서는 발생하지 않을 수 있습니다. 다른 MAT-파일 형식으로 전환 어떤 상황에서

해결

는 경고를 제거 할 수 있습니다.

http://www.mathworks.ch/support/bugreports/857319

편집

: 나는 저장하는 오래된 형식을 시도했지만이 중 하나가 작동하지 않습니다. "오류 닫기 파일"( http://www.mathworks.ch/matlabcentral/answers/18098-error-using-save-error-closing-file)이 나타납니다. 그래서 Matlab은 클래스 객체를 저장하는 것을 지원하지 않습니다. 그런 다음 메모리 문제로 생생하고 GUI를 사용할 때마다 Matlab을 다시 시작해야합니다.

+0

클래스에'load'와'save' 오버로드를 고려 했습니까? 클래스 (실제 데이터)의 속성 만 저장 한 다음이 구조체가 전체 클래스 인스턴스를 작성하는 생성자를 만드시겠습니까? – Shai

+0

@Shai 생각하지는 않았지만 데이터 구조는'struct.classObject.data'입니다. 또한 다른 유형의 클래스 객체 외에도 구조체 자체에 추가 정보가 있습니다. 나는 구조체에 대해 save/load를 오버로드하거나, 전체 데이터 구조를 단일 부분으로 분해하고 다시 작성하는 추가 함수를 작성해야합니다. 꽤 복잡하기 때문에 이것이 너무 많은 노력이라고 생각합니다. 그러나 그 아이디어에 감사드립니다. – idono

+0

'struct (myClassInstance)'를하면 어떻게됩니까? – Shai

-1

Matlab에는 garbage collector이 있으므로 수동으로 메모리를 관리 할 필요가 없습니다. GUI를 닫으면 작업 공간에있는 것을 제외하고 모든 메모리가 해제됩니다. clear을 사용하여 작업 공간 변수를 지울 수 있습니다.

Windows에서 (다른 플랫폼에 대해 확실하지 않은) 한 가지 사실은 Matlab의 GUI가 때로는 추가 메모리 (어쩌면 100MB이지만보고있는 것처럼 여러 GB가 아님)를 유지한다는 것입니다. 간단히 GUI를 최소화하고 복원하면이 초과 메모리가 제거됩니다.

1

memory 스크린 샷을 기반으로하면 지워지지 않는 메모리가 있습니다. Matlab의 가비지 수집에 근본적인 결함이 있다는 작은 기회가 있지만, ~ 6Gigs의 메모리 상주 데이터가 일련의 링크를 통해 실제로 사용 가능할 가능성이 훨씬 더 높습니다. 타이머의 콜백 함수 중 하나가이 데이터를 참조하는 경우 (또는 사본) :

  • 타이머 개체 : 개인의 경험을 바탕으로, 여기에 생각 메모리를 계속 사용할 수 있습니다 지워 졌음을 몇 가지 방법이 있습니다 그 데이터는 계속 사용할 수 있습니다. 해당 타이머에 deleted(t)으로 전화해야합니다.

  • 함수의 영구 변수 : 함수 내의 영구 변수에 데이터를 캐시하는 경우가 있습니다.이 데이터는 향후에 해당 데이터에 대한 액세스가 허용되므로 삭제되지 않습니다. 연관된 영구 변수를 지우려면 clear FUNCTIONNAME으로 전화해야합니다.

  • GUI 개체에서 데이터 또는 콜백 함수 내에서 : 그림 및 모든 영구 항목을 지워야합니다.

  • 데이터를 보유 할 수있는 클래스의 모든 정적 메서드 또는 상수 특성. 클래스 내에서 개별적으로 지울 수도 있고, clear CLASSNAME을 사용하여 강제로 지울 수도 있습니다.데이터에 오래된 링크를 찾는

몇 가지 팁 (다시, 개인 실수 기준) 바이트의 정확한 수에

  • 봐가를 얻기 위해 x=memory; 호출을 사용하여, 각 호출 후 손실되는 정확한 카운트. 일관성이 있습니까? 당신이 알고있는 번호입니까? 때로는 정확히 238263232 바이트라는 사실을 알게 된 후 누수를 찾을 수 있습니다. 따라서 29782904 double 배열은 함수 xyz에서 가져와야합니다.

  • 실제로 어떤 클래스가 삭제되는지보십시오. delete(obj) 함수 내에서 자세한 표시 또는 삭제할 개체와 추론을 추가합니다. 주어진 삭제되지 않은 객체의 경우 어디에서 참조 할 수 있습니까? 당신이하고있는 것처럼 delete(obj) 함수의 데이터를 지울 필요는 없습니다. Matlab이이를 처리해야합니다. 대신 delete 함수를 디버깅 도구로 사용하십시오.

+0

나는 그것을 더 아래로 좁혔다. 그것은 GUI 자체가 아니라 저장 /로드입니다. 방금 작업 공간에서 처음부터 객체를 생성하고 파일 크기 때문에'-v7.3 형식 '으로 객체를 저장했습니다. 작업 공간 지우기가 잘 작동하고 각 객체에 대해 소멸자가 호출되고 메모리가 해제됩니다. hdd에서 같은 개체를 다시로드 한 후 지우기가 작동하지 않아 경고가 나타납니다. 'ClassName'클래스의 개체가 존재합니다. 이 클래스 또는 상위 클래스를 지울 수 없습니다. 각 객체에 대해'delete (classObj)'를 사용하면 소멸자가 호출되지만 메모리를 해제하지는 않습니다. – idono

관련 문제