Разница в sys.getsizeof, nbytes и DataArray.size в xarray - PullRequest
1 голос
/ 04 ноября 2019

Мне любопытно узнать о различиях некоторых методов проверки размера набора данных xarray, когда я решаю, могу ли я успешно загрузить все это в память.

Я открываю набор осадков netcdfsс:

imerg_xds = xr.open_mfdataset('../data/IMERG/3B-DAY.MS.MRG.3IMERG.2018*.nc4',combine='by_coords', parallel=True)
imerg_xds

И вывод:

<xarray.Dataset>
Dimensions:                    (lat: 501, lon: 550, nv: 2, time: 303)
Coordinates:
  * lon                        (lon) float32 -84.95 -84.85 ... -30.049992
  * nv                         (nv) float32 0.0 1.0
  * lat                        (lat) float32 -35.05 -34.95 ... 14.950002
  * time                       (time) object 2018-02-01 00:00:00 ... 2018-11-30 00:00:00
Data variables:
    precipitationCal           (time, lon, lat) float32 dask.array<chunksize=(1, 550, 501), meta=np.ndarray>
    HQprecipitation            (time, lon, lat) float32 dask.array<chunksize=(1, 550, 501), meta=np.ndarray>
    precipitationCal_cnt       (time, lon, lat) int16 dask.array<chunksize=(1, 550, 501), meta=np.ndarray>
    randomError                (time, lon, lat) float32 dask.array<chunksize=(1, 550, 501), meta=np.ndarray>
    randomError_cnt            (time, lon, lat) int16 dask.array<chunksize=(1, 550, 501), meta=np.ndarray>
    time_bnds                  (time, nv) object dask.array<chunksize=(1, 2), meta=np.ndarray>
    precipitationCal_cnt_cond  (time, lon, lat) int16 dask.array<chunksize=(1, 550, 501), meta=np.ndarray>
    HQprecipitation_cnt        (time, lon, lat) int16 dask.array<chunksize=(1, 550, 501), meta=np.ndarray>
    HQprecipitation_cnt_cond   (time, lon, lat) int16 dask.array<chunksize=(1, 550, 501), meta=np.ndarray>
Attributes:
    BeginDate:       2018-02-01
    BeginTime:       00:00:00.000Z
    EndDate:         2018-02-01
    EndTime:         23:59:59.999Z
    FileHeader:      StartGranuleDateTime=2018-02-01T00:00:00.000Z;\nStopGran...
    InputPointer:    3B-HHR.MS.MRG.3IMERG.20180201-S000000-E002959.0000.V06B....
    title:           GPM IMERG Final Precipitation L3 1 day 0.1 degree x 0.1 ...
    DOI:             10.5067/GPM/IMERGDF/DAY/06
    ProductionTime:  2019-06-17T17:37:44.330Z
    history:         2019-10-22 15:41:09 GMT Hyrax-1.15.1 https://gpm1.gesdis...

Затем я хочу проверить размер, поэтому я использую:

print("sys.getsizeof result:", sys.getsizeof(imerg_xds.HQprecipitation))
print("nbytes in MB:", imerg_xds.HQprecipitation.nbytes / (1024*1024))
print("DataArray.size in MB", imerg_xds.HQprecipitation.size / (1024*1024))

И результат:

sys.getsizeof result: 96
nbytes in MB: 318.49536895751953
DataArray.size in MB 79.62384223937988

Я предполагаю, потому что я использую параллельный = True, что набор данных на самом деле не находится в памяти, и именно поэтому sys.getsizeof так низок, но в чем разница между nbytes и DataArray.size? Возможно, это связано со сжатием netcdf. DataArray.size сообщает о сжатом размере?

...