Aktionen

NetCDF Kompression von Daten durch Aufsammeln: Unterschied zwischen den Versionen

Aus BAWiki

imported>Lang Guenther
imported>Lang Guenther
(Erstversion mit korrigiertem Text)
Zeile 2: Zeile 2:
=Kurze Beschreibung=
=Kurze Beschreibung=


Kompression von Daten durch Aufsammeln. Darunter versteht man den Vorgang, dauerhaft fehlende Daten eines Datensatzes (einer Variablen) vor dem Schreiben der Daten in eine Datei aus dem Datensatz zu entfernen.
Kompression von Daten durch Aufsammeln. Darunter versteht man den Vorgang, dauerhaft fehlende Daten eines Datensatzes (einer Variablen) vor dem Schreiben der Daten aus dem Datensatz zu entfernen.


=Beispiel=
=Beispiel=
Zeile 17: Zeile 17:
::: Mesh2_poly_salinity_3d:grid_mapping = "crs" ;
::: Mesh2_poly_salinity_3d:grid_mapping = "crs" ;


Für jeden Zeitschritt werden ''poly_depth_3d'' mal ''nMesh2_poly'' Werte erzeugt. Diese Zahl kann bei Verwendung von z-Schichten sehr viel größer als die Anzahl aktiver Datenpunkte sein, da die Anzahl der über einem Polygon befindlichen (aktiven) Datenpunkte von Polygon zu Polygon bei variabler Topografie sehr stark schwanken kann. Mit dieser Definition der Variablen würden dann unnötig viele, dauerhaft ungültige Datenwerte mit ''_FillValue'' in der Datei abgelegt werden.
Für jeden Zeitschritt werden ''poly_depth_3d''*''nMesh2_poly'' Werte geschrieben. Diese Zahl kann bei Verwendung von z-Schichten sehr viel größer als die Anzahl aktiver Datenpunkte sein, da die Anzahl der über einem Polygon befindlichen (aktiven) Datenpunkte von Polygon zu Polygon bei variabler Topografie sehr stark schwanken kann.


==Komprimierte Daten==
==Komprimierte Daten==
Zeile 31: Zeile 31:
::: Mesh2_poly_salinity_3d:grid_mapping = "crs" ;
::: Mesh2_poly_salinity_3d:grid_mapping = "crs" ;


Für jeden Zeitschritt werden nur noch ''nMesh2_cell'' Werte erzeugt. Dies entspricht der maximalen Anzahl aktiver Datenpunkte. Hierdurch wird der Speicherplatzbedarf um typischer Weise 60 bis 80 % reduziert. Der Zusammenhang von ''nMesh2_cell'' mit ''poly_depth_3d'' und ''nMesh2_poly'' wird mit Hilfe der (zusätzliche) Koordinatenvariable ''nMesh2_cell'' beschrieben:
Für jeden Zeitschritt werden nur noch ''nMesh2_cell'' Werte geschrieben. Dies entspricht der maximalen Anzahl aktiver Datenpunkte. Hierdurch wird der Speicherplatzbedarf um typischer Weise 60 bis 80 % reduziert. Der Zusammenhang von ''nMesh2_cell'' mit ''poly_depth_3d'' und ''nMesh2_poly'' wird durch folgende Koordinatenvariable ''nMesh2_cell'' beschrieben:


:: integer <font color=blue>nMesh2_cell</font>(<font color=blue>nMesh2_cell</font>) ;
:: integer <font color=blue>nMesh2_cell</font>(<font color=blue>nMesh2_cell</font>) ;
::: nMesh2_cell:compress = "poly_depth_3d nMesh2_poly" ;
::: nMesh2_cell:compress = "poly_depth_3d nMesh2_poly" ;


Die Koordinatenvariable ''nMesh2_cell'' enthält die Referenzliste der zu speichernden Daten. Die Länge der Liste entspricht dabei der Anzahl der zu speichernden Werte. Die Präsenz des Attributs ''compress'' zeigt an, dass es sich bei dieser Variablen nicht um eine normale Koordinatenvariable sondern um eine Listenvariable handelt. Mit Hilfe der Angabe der originalen Dimensionen sowie der Listewerte kann der exakte Inhalt des unkomprimierten Feldes rekonstruiert werden. Dauerhaft fehlende Werte werden dabei mit ''_FillValue'' aufgefüllt.
Die Koordinatenvariable ''nMesh2_cell'' enthält die Referenzliste der zu speichernden Daten. Die Länge der Liste entspricht dabei der Anzahl der zu speichernden Werte. Die Präsenz des Attributs ''compress'' zeigt an, dass es sich bei dieser Variablen nicht um eine normale Koordinatenvariable sondern um eine Listenvariable handelt. Mit Hilfe der Angabe der originalen Dimensionen sowie der Listenwerte kann der exakte Inhalt des unkomprimierten Feldes rekonstruiert werden. Dauerhaft fehlende Werte werden dann mit ''_FillValue'' aufgefüllt.


=Vorgehensweise=
=Vorgehensweise=
Zeile 45: Zeile 45:
* Deklaration in Fortran-Syntax:  
* Deklaration in Fortran-Syntax:  
*: Mesh2_poly_salinity_3d(nMesh2_poly,poly_depth_3d,time).
*: Mesh2_poly_salinity_3d(nMesh2_poly,poly_depth_3d,time).
Da die benutzte Syntax für die Werte der Listenvariable ohne Bedeutung ist, wird nachfolgend die Fortran-Syntax wird verwendet.
Da die benutzte Syntax für die Werte der Listenvariable ohne Bedeutung ist, wird nachfolgend die Fortran-Syntax verwendet.


==Komprimieren von Daten==
==Komprimieren von Daten==
# Man erzeuge ein Maskenfeld mit identischer Gestalt zu den zu komprimierenden Dimensionen,
# Maskenfeld mit identischer Gestalt zu den zu komprimierenden Dimensionen,
#: Mask_3d(poly_depth_3d,nMesh2_poly).
#: Mask_3d(poly_depth_3d,nMesh2_poly).
# Initialisierung: Mask_3d( :, : ) = .false. .
# Initialisierung: Mask_3d( :, : ) = .false. .
Zeile 58: Zeile 58:


==Dekomprimieren von Daten==
==Dekomprimieren von Daten==
# Man erzeuge die Maskenfelder Mask und Mask_3d:
# Maskenfelder Mask und Mask_3d:
#: Mask_(poly_depth_3d*nMesh2_poly), und
#: Mask_(poly_depth_3d*nMesh2_poly), und
#: Mask_3d(poly_depth_3d,nMesh2_poly).
#: Mask_3d(poly_depth_3d,nMesh2_poly).

Version vom 14. September 2010, 14:47 Uhr

Kurze Beschreibung

Kompression von Daten durch Aufsammeln. Darunter versteht man den Vorgang, dauerhaft fehlende Daten eines Datensatzes (einer Variablen) vor dem Schreiben der Daten aus dem Datensatz zu entfernen.

Beispiel

Unkomprimierte Daten

double Mesh2_poly_salinity_3d(time,poly_depth_3d,nMesh2_poly) ;
Mesh2_poly_salinity_3d:standard_name = "sea_water_salinity" ;
Mesh2_poly_salinity_3d:long_name = "salinity for 2D mesh polygons, vertically structured" ;
Mesh2_poly_salinity_3d:units = "0.001" ;
Mesh2_poly_salinity_3d:coordinates = "Mesh2_poly_lon Mesh2_poly_lat" ;
Mesh2_poly_salinity_3d:_FillValue = fillvalue ;
Mesh2_poly_salinity_3d:valid_range = valid minimum, valid maximum ;
Mesh2_poly_salinity_3d:cell_methods = "poly_depth_3d: mean nMesh2_poly: mean" ;
Mesh2_poly_salinity_3d:cell_measures = "volume: Mesh2_poly_water_volume_3d" ;
Mesh2_poly_salinity_3d:grid_mapping = "crs" ;

Für jeden Zeitschritt werden poly_depth_3d*nMesh2_poly Werte geschrieben. Diese Zahl kann bei Verwendung von z-Schichten sehr viel größer als die Anzahl aktiver Datenpunkte sein, da die Anzahl der über einem Polygon befindlichen (aktiven) Datenpunkte von Polygon zu Polygon bei variabler Topografie sehr stark schwanken kann.

Komprimierte Daten

double Mesh2_poly_salinity_3d(time,nMesh2_cell) ;
Mesh2_poly_salinity_3d:standard_name = "sea_water_salinity" ;
Mesh2_poly_salinity_3d:long_name = "salinity for 2D mesh polygons, vertically structured" ;
Mesh2_poly_salinity_3d:units = "0.001" ;
Mesh2_poly_salinity_3d:coordinates = "Mesh2_poly_lon Mesh2_poly_lat" ;
Mesh2_poly_salinity_3d:_FillValue = fillvalue ;
Mesh2_poly_salinity_3d:valid_range = valid minimum, valid maximum ;
Mesh2_poly_salinity_3d:cell_methods = "nMesh2_cell: mean" ;
Mesh2_poly_salinity_3d:cell_measures = "volume: Mesh2_poly_water_volume_3d" ;
Mesh2_poly_salinity_3d:grid_mapping = "crs" ;

Für jeden Zeitschritt werden nur noch nMesh2_cell Werte geschrieben. Dies entspricht der maximalen Anzahl aktiver Datenpunkte. Hierdurch wird der Speicherplatzbedarf um typischer Weise 60 bis 80 % reduziert. Der Zusammenhang von nMesh2_cell mit poly_depth_3d und nMesh2_poly wird durch folgende Koordinatenvariable nMesh2_cell beschrieben:

integer nMesh2_cell(nMesh2_cell) ;
nMesh2_cell:compress = "poly_depth_3d nMesh2_poly" ;

Die Koordinatenvariable nMesh2_cell enthält die Referenzliste der zu speichernden Daten. Die Länge der Liste entspricht dabei der Anzahl der zu speichernden Werte. Die Präsenz des Attributs compress zeigt an, dass es sich bei dieser Variablen nicht um eine normale Koordinatenvariable sondern um eine Listenvariable handelt. Mit Hilfe der Angabe der originalen Dimensionen sowie der Listenwerte kann der exakte Inhalt des unkomprimierten Feldes rekonstruiert werden. Dauerhaft fehlende Werte werden dann mit _FillValue aufgefüllt.

Vorgehensweise

Es soll die Variable "Mesh2_poly_salinity_3d" betrachtet werden.

  • Deklaration in CDL-Syntax:
    Mesh2_poly_salinity_3d(time,poly_depth_3d,nMesh2_poly);
  • Deklaration in Fortran-Syntax:
    Mesh2_poly_salinity_3d(nMesh2_poly,poly_depth_3d,time).

Da die benutzte Syntax für die Werte der Listenvariable ohne Bedeutung ist, wird nachfolgend die Fortran-Syntax verwendet.

Komprimieren von Daten

  1. Maskenfeld mit identischer Gestalt zu den zu komprimierenden Dimensionen,
    Mask_3d(poly_depth_3d,nMesh2_poly).
  2. Initialisierung: Mask_3d( :, : ) = .false. .
  3. Setze Mask_3d( i, j ) auf .true., falls die Daten für Position ( i, j ) geschrieben werden sollen.
  4. Bilde das Feld Mask_3d( :, : ) auf das Feld Mask( : ) ab (Fortran RESHAPE):
    Mask(poly_depth_3d*nMesh_poly).
  5. Die Indizes i mit Mask( i ) = .true. ergeben dann die Werte der Listenvariablen.
  6. Packe die zu komprimierenden Daten in das zu schreibende Feld (Fortran PACK) unter Verwendung von Mask_3d( :, : ).

Dekomprimieren von Daten

  1. Maskenfelder Mask und Mask_3d:
    Mask_(poly_depth_3d*nMesh2_poly), und
    Mask_3d(poly_depth_3d,nMesh2_poly).
  2. Initialisierung: Mask( : ) = .false. .
  3. Für die Werte der Listenvariablen setze man Mask( i ) = .true. .
  4. Bilde das Feld Mask( : ) auf das Feld Mask_3d( :, : ) ab (Fortran RESHAPE).
  5. Entpacke die zu dekomprimierenden Daten (Fortran UNPACK) unter Verwendung von Mask_3d( :, : ) und _FillValue.

zurück zu NetCDF


Strukturübersicht