2014-11-21 2 views
0

약 2GB의 대용량 텍스트 파일을 읽고 해당 데이터에 대해 일련의 작업을 수행하고 싶습니다. 접근 방식에 따라Matlab에서 RAM이 부족한 대용량 텍스트 파일 읽기

tic 
    fid=fopen(strcat(Name,'.dat')); 
    C=textscan(fid, '%d%d%f%f%f%d'); 
    fclose(fid); 

    %Extract cell values 

    y=C{1}(1:Subsampling:end)/Subsampling; 
    x=C{2}(1:Subsampling:end)/Subsampling; 
    %... 
    Reflectanse=C{6}(1:Subsampling:end); 
    Overlap=round(Overlap/Subsampling); 

실패 immediatly 내 메모리 사용량이 이상한 피크 C (C=textscan(fid, '%d%d%f%f%f%d');)을 읽은 후 : enter image description here 무엇이 크기의 파일을 가져올 수있는 가장 좋은 방법은 무엇인가요? textscan()을 사용하여 텍스트 파일의 개별 부분을 읽는 방법이 있습니까? 아니면이 작업에 더 적합한 다른 기능이 있습니까?

편집은 다음 textscan의 모든 열은 3D-포인트에 대한 정보 필드의 정보가 포함

width hieght X  Y  Z  Grayscale 
345 453 3.422 53.435 0.234 200 
346 453 3.545 52.345 0.239 200 
... % and so on for ~40 millon points 
+0

한 번에 한 줄씩 데이터를 읽고 처리 할 수 ​​있습니까? – Ayb4btu

+0

한 번에 한 행을 처리 할 수 ​​있지만 단일 행/열을 읽는 데 textscan()을 사용하는 방법을 모르겠습니다. – McMa

+0

텍스트 파일의 몇 줄을 게시하여 textscan의 작동 방식을 더 잘 이해할 수 있습니까? 작동합니다. – Ayb4btu

답변

1

각 행을 처리 할 수있는 경우 개별적으로 다음 코드는 당신이 할 수 있습니다. 데이터 블록을 지정하려는 경우 start_lineend_line을 포함 시켰습니다.

headerSpec = '%s %s %s %s %s %s'; 
dataSpec = '%f %f %f %f %f %f'; 
fid=fopen('data.dat'); 

% Read Header 
names = textscan(fid, headerSpec, 1, 'delimiter', '\t'); 

k = 0; 
% specify a start and end line for getting a block of data 
start_line = 2; 
end_line = 3; 

while ~feof(fid) 
    k=k+1; 

    if k < start_line 
     continue; 
    end 

    if k > end_line 
     break; 
    end 

    % get data 
    C = textscan(fid, dataSpec, 1, 'delimiter', '\t'); 
    row = [C{1:6}]; % convert data from cell to vector 

    % do what you want with the row 

end 

fclose(fid); 

전체 파일에 읽기의 가능성이있다, 그러나 이것은 당신이 사용할 수있는 메모리의 양에 따라 달라집니다 및 MATLAB은 장소에 어떤 제한이있는 경우. 이것은 명령 창에서 memory을 입력하면 볼 수 있습니다.

+0

작동, 감사합니다! – McMa