2012-02-03 2 views
9

매트릭스 파일 형식 (예 : 4070x4070)의 대형 MATLAB 파일 (150MB)이 있습니다. 이 파일을 MATLAB에서 작업해야하지만이 파일을로드 할 수 없습니다. "메모리 부족"오류가 발생합니다. 이 파일 크기를로드 할 수있는 다른 방법이 있습니까? 32 비트 프로세서를 사용 중이며 2GB의 RAM이 있습니다. 제발 도와주세요, 나는이 문제를 다룰 때 지쳐 가고 있습니다.MATLAB에서 대용량 파일 (~ 150MB)을로드하려면 어떻게해야합니까?

+4

* .mat 파일 형식 또는 다른 형식입니까? – hatboyzero

+1

오픈 할 때 150MB 파일이 2GB의 메모리를 가득 채울 수 있다는 것에 매우 놀랐습니다! 로드를 시도하기 전에 사용 가능한 메모리가 얼마나 남았습니까? 닫을 수있는 다른 프로그램이 있습니까? – japreiss

+0

.mat 파일 인 경우,'whos -file '도 문제를 일으키거나 그냥'load'합니까? .mat 파일이 아니라면 헤더 텍스트가 있습니까? –

답변

3

이미지 파일이고 작업하고 싶다면 matlab block processing을 사용해보십시오. 이를 사용하여 파일의 작은 부분을로드합니다. 귀하의 기능 fun은 각 블록에 개별적으로 적용됩니다. (그 지적에 대한 @Nzbuu 덕분에)하지만 문서화되지 않은 기능 것 같다 - 경우

B = blockproc(src_filename,[M N],fun) 

그것이 xml 파일이, SAX와 함께 XML DOM Node 모드를 사용해보십시오.

또한 모든 종류의 텍스트 파일 (데이터 량 때문에) 인 경우 분리 할 외부 도구를 사용해보십시오.

+1

입니다. XML DOM은 전체 파일을 먼저 메모리로 읽어들이므로 여기서는 도움이되지 않습니다. SAX는 XML을 스트리밍하고 이벤트를 발생시켜 데이터를 처리합니다. 또한 MATLAB에서 DOM 객체를 처리하는 속도가 느린 것을 발견했습니다. – Nzbuu

+0

@ Nbubu, 감사합니다. 어떤 이유로 MATLAB은 항상 SAX를 사용합니다. 빠른 google 검색 결과 귀하가 옳았다는 것이 밝혀졌습니다. –

+0

DOM 트리를 만드는 데 SAX를 사용한다고 생각합니다. – Nzbuu

11

Starting 릴리스 R2011b (ver.7.13)부터 matlab.io.MatFileMATFILE이라는 새 개체가 생성자로 있습니다. MAT- 파일의 변수 부분을로드하고 저장할 수 있습니다. 자세한 내용은 설명서를 참조하십시오. 다음은 행렬의 일부가 읽을 수있는 간단한 예입니다 : 원본 파일이 MAT 파일이 아닌 경우

matObj = matfile(filename); 
a = matObj.a(100:500, 200:600); 

는 있지만, 일부 텍스트 파일, 당신은 그것을 부분적으로 읽고 같은 변수에 그 부분을 저장 matfile을 사용할 수 있습니다 나중에 액세스 할 수 있도록 MAT 파일에 저장하십시오. 생성자에서 Writable 속성을 true로 설정하는 것을 잊지 마십시오. 텍스트 파일을 가정

탭으로 구분하고 숫자 만 포함하고, 여기에 블록으로 데이터를 읽고 MAT 파일에 저장하는 예제 스크립트입니다 : 나는 최신 버전이없는

blocksize = 100; 
startrow = 0; 
filename = 'test.mat'; 
matObj = matfile(filename,'Writable',true); 
while true 
    try 
     a = dlmread(filename,'\t',startrow,0); %# depends on your file format 
     startrow = startrow + blocksize; 
     matObj.a(startrow+(1:blocksize),:) = a; 
    catch 
     break 
    end 
end 

이제 테스트를 해보고 작동시켜야한다.

1

또한 사용자는 MATLAB의 Memory-Mapping of Data Files을 사용하여 파일 블록을 읽고 처리 한 다음 블록으로 진행하여없이 전체 파일을 한 번에 메모리에로드 할 수 있습니다.

예를 들어, "100 배정도 부동 소수점 파일을 메모리에 매핑하는"this example을 참조하십시오.

+0

MATLAB에 방금 등장했을 때이 객체를 이전 버전에서 사용해 보았습니다. 흥미롭게도 MATLAB은 어쨌든 전체 파일을 메모리에로드해야했습니다. Mathworks 지원팀에 연락하여 확인했습니다.그들은 기본적으로이 기능을 다른 응용 프로그램간에 동시에 공유 할 수있는 기능으로 홍보했습니다. 글쎄요, 상황이 바뀌었나 봅니다. 나는 R2011a로 다시 시도했고'memmapfile' 객체는 300b만을 사용했습니다. 좋은 대답. +1. 파일은이 객체에 대해 규칙적인 구조를 가져야하므로 (바이너리 만?) 입력 파일을 다시 포맷해야 할 수 있습니다. – yuk