Я открываю файлы NetCDF из центра обработки данных Copernicus, используя xarray версии 2024-11-0, используя функцию open_dataset следующим образом:
Код: Выделить всё
import xarray as xr
file1=xr.open_dataset("2021-04.nc")
tem = file1['t2m']
Хотя размер файла составляет 16,6 МБ, переменная tem, кажется, занимает двойной размер фактического файла, как можно увидеть ниже (конец первой строки) или контролировать с помощью команды top
Код: Выделить всё
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
Я могу использовать file1[t2m].astype ('float16'), что уменьшает размер вдвое, но я обнаружил, что большинство значений округляются до первого десятичного знака, поэтому я теряю фактические данные. Я хочу прочитать фактические данные, не используя память, превышающую размер файла данных.
Вот как данные выглядят при чтении как число с плавающей запятой 32
Код: Выделить всё
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:
Код: Выделить всё
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)
Код: Выделить всё
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)
Подробнее здесь: https://stackoverflow.com/questions/793 ... ile-itself