2014-01-30 3 views
1

다음과 같은 문제가 있습니다. 데이터가 포함 된 큰 파일을 검색하는 코드를 개발했으며 프로세스가 너무 느려지고 일부 컴퓨터에서 사용 가능한 모든 컴퓨터 리소스를 사용합니다. MATLAB에서 외부 파일을 더 효율적으로 읽음

nodo=str2num(get(handles.nodo,'string'));         
PATHNAME = uigetdir('', 'Selecciona el directorio donde están los bfins'); 
files = dir(fullfile(PATHNAME,'*.bfin'));         
curr_folder=pwd;               
cd(PATHNAME);                
archivo={files.name}';              
for i=1:numel(archivo)              
     [fid{i}, errmsg]=fopen(files(i).name)         
     disp(errmsg);               
     Datos{i}=textscan(fid{i}, '%s %f %s %f %s %f ','Headerlines',2);  
     AllNodos{i}=Datos{1,i}{1,2};           
     AllTemp{i}=Datos{1,i}{1,4};           
end                  
cd(curr_folder)               
for i=1:size(AllNodos,2)             
     sets{i}=cat(2, AllNodos{1,i}, AllTemp{1,i});       
end                  
for i=1:size(AllNodos,2)             
     vectn{i}=AllNodos{1,i};            
     r{i}=find(vectn{i}==nodo);            
     Temps{i}=AllTemp{1,i}(r{i});           
end 
    %Write Excel File 
[FileName, PathName] = uiputfile('*.xlsx', 'Escribe un archivo excel con las temperaturas...') 
savingas=fullfile(PathName,FileName); 
a=archivo'; 
B=cat(1,a,Temps); 
xlswrite(savingas,[B]) 
e = actxserver ('Excel.Application'); %# open Activex server 
ewb = e.Workbooks.Open(savingas); %# open file (enter full path!) 
ewb.Worksheets.Item(1).Name = num2str(nodo); %# rename 1st sheet 
ewb.Save %# save to the same file 
ewb.Close(false) 
e.Quit                

어떤 코드가 실제로하는 일은 파일에 문자열의 위치를 ​​찾은 다음 다른 변수 (단지 CNTRL + F 작업)을 찾아이 될 것이라고에 대한 엑셀 시트에 어떤 도움을 재현하는 것입니다 고맙습니다.

편집 ---- 모든 의견 주셔서 대단히 감사합니다, 나는 그것을 저장하는 변수들에 의해 수행하는 데 사용 unnecesary 시간을 많이 절약 할 다음 코드를 내놓았다 :

for i=1:num_archivo 
    [fid(i), errmsg]=fopen(files(i).name) 
    disp(errmsg); 
    Datos=textscan(fid(i), '%s %f %s %f','delimiter',',','HeaderLines',hl); 
    AllNodos=Datos(1,2); 
    AllTemp=Datos(1,4); 
    for k=1:numel(nodo) 
    r{i,k}=find(AllNodos{1,1}==nodo(k)); 
    Temps{i,k}=AllTemp{1,1}(r{i,k}); 
    end 
    end 
+0

파일의 크기는 대략 얼마이고 얼마나 많은 파일을 말하고 있습니까? – sebastian

+0

파일은 약 25MB의 각 파일과 약 8 개의 파일을 처리 할 수 ​​있습니다. – user2751649

답변

1

textscan 자체가 매우 빠르므로 CPU를 먹을 수도 있지만 성능면에서는 개선되지는 않을 것입니다. 그러나 셀 배열에 대한 사전 할당을 수행하지 않는 것 같습니다. 이것은 Matlab이 지속적으로 메모리를 재 할당 할 수 있음을 의미합니다. 원하는 크기의 빈 셀 어레이 만들 cell를 사용하여 (. @Lazarus 지적에 아마 셀 안 Datos 있지만)

num_archivo = numel(archivo); 
Datos = cell(1,num_archivo); 
AllNodos = cell(1,num_archivo); 
AllTemp = cell(1,num_archivo); 
for i = 1:num_archivo 
    ... 
end 
... 

을 당신은 sets와 다른 루프 물건의 같은 종류의 작업을 수행해야 , vectn

내가해야 것 한가지는 바로 당신이 열려있는 파일 포인터의 무리를하지 않도록 files(i).name를 읽고을 완료 한 후 호출 fclose(fid);입니다. 또한 루프 외부에서 사용하지 않으므로 파일 배열 fid을 셀 배열에 저장해야 할 이유가없는 것으로 보입니다. 비록 당신이했다면, 정규 벡터 (numel(archive) 요소로 할당 됨)가 더 좋을 것입니다.

1

내 대답은 데이터 집합의 크기에 따라 달라집니다. 하지만 내가 처음 만들려는 변경은 Datos{i}을 단지 Datos으로 설정하는 것입니다. 왜냐하면 for 루프에서만 사용하기 때문입니다. 이 방법은 matlab에 더 많은 공간을 할당 할 필요가 없습니다. 내가 만들 것

두 번째 변화는 당신이 또한 AllnodosAllnodos{i}을 교체하고 또한 할당 문제에 저장할 수 있도록, 루프에 대한 첫 번째 내하여 catfind 기능을 포함하는 것입니다.

이는 리소스 문제와 관련하여 도움이됩니다. textscan이 제한 요소 인 경우 속도 문제에 도움이되지 않을 수 있습니다. textscan 전후에 tictoc을 사용하면 복용하는 데 걸리는 시간을 알려줍니다.

+0

솔루션에 대해 좀 더 구체적으로 설명해 주시겠습니까? 내가 말한 것을 시도했지만 "매트릭스 크기를 초과하는 색인"오류가 발생하여 도움을 받으실 수 있습니다. – user2751649

+0

어떤 라인에서 오류가 발생 했습니까? – Lazarus

1

"크기가 큰"파일의 실제 크기와 파일 크기에 따라 다릅니다. 프로파일 러 사용하여 코드를 확인 : 파일을 읽는 관련된 아무것도에서 일반적으로

가, 병목 현상은 대부분 디스크입니다 ...

profile on; 
<run your code> 
profile viewer 

내가 fopentextscan 라인이 악한 것들 것으로 의심되는 것을 I/o - CPU가 아닙니다. 그런 경우 병렬 작업을 할 때를 제외하고는 정말 많은 일을 할 수 없습니다. 유감스럽게도 matlab에서 그렇게 쉬운 것은 아닙니다.

+0

병렬 작업에 대해 자세히 설명해 주시겠습니까? 병렬 컴퓨터 도구 상자에 대해 이야기하고 있다고 생각됩니다. 프로세스에 많은 시간이 걸릴지는 모르겠지만이 코드를 실행하는 동안 내 컴퓨터를 다른 작업에 사용할 수 없다면 아무 것도 할 수 있습니까? – user2751649

+0

예 - 병렬 코드를 사용하여 작업 속도를 높일 수 있습니다. 하지만이 단일 프로세스가 이미/모든 컴퓨터 (또는 하나의 matlab-instance?) 속도를 늦추고 있다면 프로세스가 많아 질수록 상황이 더욱 악화 될 것입니다. – sebastian

관련 문제