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?
Danke Reich für Ihre Antwort! – 0000011111