Python xarray.concat, затем xarray.to_netcdf генерирует огромный новый размер файла

Итак, у меня есть 3 файла netcdf4 (каждый примерно по 90 МБ), которые я хотел бы объединить с помощью пакета xarray. В каждом файле есть одна переменная (dis), представленная с разрешением 0,5 градуса (широта, долгота) за 365 дней (время). Моя цель - объединить три файла так, чтобы у нас был временной ряд 1095 дней (3 года).

Каждый файл (для 2007, 2008, 2009 годов) имеет: 1 переменную: dis 3 координаты: время, широту, долготу ... как таковые

<xarray.Dataset>
Dimensions:  (lat: 360, lon: 720, time: 365)
Coordinates:
  * lon      (lon) float32 -179.75 -179.25 -178.75 -178.25 -177.75 -177.25    ...
  * lat      (lat) float32 89.75 89.25 88.75 88.25 87.75 87.25 86.75 86.25 ...
  * time     (time) datetime64[ns] 2007-01-01 2007-01-02 2007-01-03 ...
Data variables:
    dis      (time, lat, lon) float64 nan nan nan nan nan nan nan nan nan ...

Я импортирую их и использую модуль concat для объединения, я думаю, успешно. В этом случае модуль считывает 3 имени файла netcdf из filestrF

flist1 = [1,2,3]
ds_new = xr.concat([xr.open_dataset(filestrF[0,1,1,f]) for f in flist1],dim='time')

Теперь показаны новые сведения о новом наборе данных:

Dimensions:  (lat: 360, lon: 720, time: 1095)

Мне кажется, это нормально. Однако, когда я записываю этот набор данных обратно в netcdf, размер файла увеличился, и данные за 1 год кажутся эквивалентными 700 МБ.

ds_new.to_netcdf('saved_on_disk1.nc')
  • Для 2 объединенных файлов ~ 1,5 ГБ
  • Для 3`` 2,2 ГБ
  • Для 4`` 2,9 ГБ

Я ожидал, что 3 x 90 МБ = 270 МБ - поскольку мы масштабируем (3x) в одном измерении (времени). Переменные, dis и другие размеры lat и lon остаются неизменными по размеру.

Есть идеи, пожалуйста, для огромного высококлассного размера? Я протестировал чтение и обратную запись файлов без конкатенации, и сделал это успешно без увеличения размера.


person dreab    schedule 19.05.2016    source источник


Ответы (2)


Файлы netCDF, с которыми вы начали, сжаты, вероятно, с использованием функции сжатия netCDF4 по частям.

Когда вы читаете один набор данных и записываете его обратно на диск, xarray записывает эти данные обратно с теми же настройками сжатия. Но при объединении нескольких файлов настройки сжатия сбрасываются. Частично это связано с тем, что разные файлы могут быть сжаты на диске по-разному, поэтому неясно, как следует обрабатывать комбинированный результат.

Чтобы сохранить новый файл netCDF со сжатием, используйте аргумент encoding, как описано в документации xarray:

ds_new.to_netcdf('saved_on_disk1.nc', encoding={'dis': {'zlib': True}})

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

Если вам интересно, как эти файлы были изначально сжаты, вы можете извлечь эту информацию из атрибута encoding, например, xr.open_dataset(filestrF[0,1,1,1]).dis.encoding.

person shoyer    schedule 19.05.2016
comment
Большое спасибо - это как раз то, что нужно. Я пропустил этот фрагмент в документации, которая, должна сказать, превосходна. - person dreab; 20.05.2016

Предполагая, что time является измерением записи, попробуйте использовать ncrcat NCO, чтобы быстро объединить три файла, которые должен сохранять сжатие.

ncrcat file1.nc file2.nc file3.nc -O concat.nc

person N1B4    schedule 19.05.2016