Xarray.open_dateset verwendet mehr als die doppelte Größe der Datei selbst
Posted: 13 Jan 2025, 17:05
Alle,
Ich öffne NetCDF-Dateien aus dem Copernicus-Rechenzentrum mit der Xarray-Version 2024-11-0 und verwende die Funktion open_dataset wie folgt:
Die netcdf-Datei ist auf der Box verfügbar, der Leser kann auch ein beliebiges Dateibeispiel vom oben genannten Rechenzentrum herunterladen.
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
Irgendeine Idee, warum xarray den ganzen Speicher nutzt. Dies ist für kleine Dateien kein Problem, aber für große Dateien und für umfangreiche Berechnungen, bei denen viele Kopien derselben Variablen erstellt werden, ist es zu problematisch.
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
und so sieht es unter Float 16 aus
Darüber hinaus beträgt die tatsächliche Größe der Dateidaten ein Vielfaches der tatsächlichen Größe, wenn ich die Daten in den RAM speichere und die Menge des verwendeten Speichers verfolge.
Danke
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)