2017-01-16 2 views
0

Ich habe versucht, die Größe einer netcdf Datei zu reduzieren, indem die zeitliche Auflösung der Variablen durch zwei teilt, mit dem folgenden:Größe der netcdf Datei ist nach dem Versuch, größer, um es mit Matlab zu reduzieren netcdf zu verpacken

infilename = 'original_file.nc4'; 
outfilename = 'new_file.nc4'; 
%% CREATE OUTPUT NETCDF FILE 
ncid_out = netcdf.create(outfilename,'NETCDF4'); 
%% OPEN THE INPUT NETCDF FILE 
ncid_in = netcdf.open(infilename,'NOWRITE'); % open original file in read-only mode 
[ndims,nvars] = netcdf.inq(ncid_in); 
%% DEFINE NEW DIMENSIONS 
for d = 0 : ndims-1 
    [dimname,dimlen] = netcdf.inqDim(ncid_in,d); % get dimension from input file 
    if strcmp(dimname,'time') 
     netcdf.defDim(ncid_out,dimname,dimlen/2); % new time dimension with half the resolution 
    else netcdf.defDim(ncid_out,dimname,dimlen); % other dimensions remain unchanged 
    end 
end 
%% DEFINE NEW VARIABLES AND ATTRIBUTES 
for v = 0 : nvars-1 
    [varname,~,dimids] = netcdf.inqVar(ncid_in,v); 
    out_varid = netcdf.defVar(ncid_out,varname,xtype,dimids); 
    for attnum = 0 : natts-1 
     attname = netcdf.inqAttName(ncid_in,v,attnum); 
     netcdf.copyAtt(ncid_in,v,attname,ncid_out,out_varid); 
    end 
end 
%% LEAVE DEFINE MODE AND ENTER DATA MODE 
netcdf.endDef(ncid_out); 
for v = 0 : nvars-1 
    [varname,xtype,dimids,natts] = netcdf.inqVar(ncid_in,v); 
    var = netcdf.getVar(ncid_in,v); 
    out_varid = netcdf.inqVarID(ncid_out,varname); 
    if ~isempty(find(dimids==netcdf.inqDimID(ncid_in,'time'),1)) % if time is one of the dimensions 
     indt = knnsearch(dimids',netcdf.inqDimID(ncid_in,'time')); % find which one it is 
     S = cell(1,length(dimids)); 
     for f = dimids 
      [~,dimlen] = netcdf.inqDim(ncid_in,f); % length of the dimension 
      if netcdf.inqDimID(ncid_in,netcdf.inqDim(ncid_out,f)) == dimids(indt) % if this dimension is time 
       S{indt} = 1:2:dimlen; % reduce this dimension 
      else S{knnsearch(dimids',netcdf.inqDimID(ncid_in,netcdf.inqDim(ncid_in,f)))} = 1:dimlen; 
      end 
     end 
     netcdf.putVar(ncid_out,out_varid,var(S{1:end})); % assign reduced variable 
    else netcdf.putVar(ncid_out,out_varid,var); % assign full variable 
    end 
end 
%% CLOSE INPUT AND AND OUTPUT NETCDF FILES 
netcdf.close(ncid_in); 
netcdf.close(ncid_out); 

Der Code wird ohne Fehler ausgeführt und die neue Datei enthält Variablen mit einer Zeitdimension, die der Hälfte des Originals entspricht.

Die Größe der ursprünglichen Datei war 1.1 Go, aber die Größe der neuen Datei ist 1.4 Go. Ich hatte erwartet, eine Datei mit einer Größe von ungefähr der Hälfte der ursprünglichen Größe zu produzieren, seit ich die Zeitauflösung halbiert habe. Ich bin mir nicht sicher, wie das passiert ist.

Könnten Sie uns das erklären?

Antwort

2

NetCDF4-Dateien können Deflation (verlustfreie Komprimierung) verwenden, um die Größe zu reduzieren. Ihre ursprüngliche Datei wurde wahrscheinlich mit Deflation geschrieben, während die neue nicht geschrieben wurde. Sie müssen Deflation angeben netcdf.defVarDeflate mit:

netcdf.defVarDeflate(ncid,varid,shuffle,deflate,deflateLevel) 

versuchen So kurz nach dem defVar Aufruf dieser Zeile hinzufügen, die Ihnen eine Deflation Niveau von 7 geben, mit Shuffle auf:

out_varid = netcdf.defVar(ncid_out,varname,xtype,dimids); 
netcdf.defVarDeflate(ncid_out,out_varid, true, true, 7); 

Für weitere Informationen siehe: https://www.mathworks.com/help/matlab/ref/netcdf.defvardeflate.html?requestedDomain=www.mathworks.com

+0

Danke Reich für Ihre Antwort! – 0000011111

Verwandte Themen