Xarray.open_dateset использует более чем вдвое больший размер самого файла.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Xarray.open_dateset использует более чем вдвое больший размер самого файла.

Сообщение Anonymous »

Все,
Я открываю файлы NetCDF из центра обработки данных Copernicus, используя xarray версии 2024-11-0, используя функцию open_dataset следующим образом:

Код: Выделить всё

import xarray as xr
file1=xr.open_dataset("2021-04.nc")
tem  = file1['t2m']
Файл netcdf доступен на упаковке, читатель также может загрузить любой образец файла из вышеупомянутого центра обработки данных.
Хотя размер файла составляет 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
Есть идеи, почему xarray использует всю эту память. Это не проблема для небольших файлов, но слишком проблематично для больших файлов и для тяжелых вычислений, когда создается много копий одной и той же переменной.
Я могу использовать 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:
и вот как это выглядит под float 16

Код: Выделить всё

 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»