Xarray.open_dateset verwendet mehr als die doppelte Größe der Datei selbstPython

Python-Programme
Guest
 Xarray.open_dateset verwendet mehr als die doppelte Größe der Datei selbst

Post by Guest »

Alle,
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 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

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
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

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:
und so sieht es unter Float 16 aus

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)
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.

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)
Danke

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post