Ich öffne NetCDF-Dateien aus dem Copernicus-Rechenzentrum mit der Xarray-Version 2024-11-0 und verwende die Funktion open_dataset wie folgt:
Code: Select all
import xarray as xr
file1=xr.open_dataset("2021-04.nc")
tem = file1['t2m']
Die Dateigröße ist zwar groß 16,6 MB, die tem-Variable scheint doppelt so groß zu sein wie die tatsächliche Datei, wie unten (Ende der ersten Zeile) zu sehen ist oder mit dem oberen Befehl
überwacht werden kann
Code: Select all
Size: 39MB
[9753030 values with dtype=float32]
Coordinates:
number int64 8B ...
* latitude (latitude) float64 3kB 38.0 37.9 37.8 37.7 ... -2.8 -2.9 -3.0
* longitude (longitude) float64 6kB -18.0 -17.9 -17.8 ... 60.8 60.9 61.0
* valid_time (valid_time) datetime64[ns] 240B 2021-04-01 ... 2021-04-30
Attributes: (12/32)
GRIB_paramId: 167
GRIB_dataType: fc
GRIB_numberOfPoints: 325101
GRIB_typeOfLevel: surface
GRIB_stepUnits: 1
GRIB_stepType: instant
...
GRIB_totalNumber: 0
GRIB_units: K
long_name: 2 metre temperature
units: K
standard_name: unknown
GRIB_surface: 0.0
Ich kann file1[t2m].astype verwenden ('float16'), was die Größe auf die Hälfte reduziert, aber ich habe festgestellt, dass die meisten Werte auf die erste Dezimalstelle gerundet sind, sodass ich tatsächliche Daten verliere. Ich möchte die tatsächlichen Daten lesen, ohne mehr Speicher als die Größe der Datendatei verwenden zu müssen.
So sehen die Daten aus, wenn sie als Float 32 gelesen werden
Code: Select all
Size: 120B
array([293.87134, 296.0669 , 299.4065 , 302.60474, 305.29443, 306.87646,
301.10645, 302.47388, 299.23267, 294.26587, 295.239 , 299.19238,
302.20923, 307.48193, 307.2202 , 310.6953 , 315.64746, 312.76416,
305.2173 , 299.25488, 299.9475 , 302.3435 , 306.32422, 312.75342,
299.99878, 300.59155, 303.36475, 307.11768, 308.49292, 310.6853 ],
dtype=float32)
Coordinates:
Code: Select all
Size: 60B
array([293.8, 296. , 299.5, 302.5, 305.2, 307. , 301. , 302.5, 299.2,
294.2, 295.2, 299.2, 302.2, 307.5, 307.2, 310.8, 315.8, 312.8,
305.2, 299.2, 300. , 302.2, 306.2, 312.8, 300. , 300.5, 303.2,
307. , 308.5, 310.8], dtype=float16)
Code: Select all
import psutil
process = psutil.Process()
print(“memory used in MB=", process.memory_info().rss / 1024**2)
tem.data
print(“memory used in MB=", process.memory_info().rss / 1024**2)