Как объединить с помощью ncrcat или cdo merge с упакованными файлами netcdf

У меня есть файлы ERA5, которые я пытаюсь объединить в ежемесячные файлы. Похоже, что файлы были упакованы для уменьшения размера, что сделало тип данных в файле коротким. Когда я пробую ncrcat, он предупреждает об обнаружении атрибута упаковки add_offset, а затем объединяет все файлы вместе. Однако значения данных теряются. Я попытался использовать ncpdq -U для распаковки файлов, затем ncrcat для объединения, который работает. Но полученные файлы слишком велики, чтобы быть полезными, и когда я пытаюсь ncpdq перепаковать получившийся файл, я получаю ошибку malloc (), которая, похоже, связана с проблемой памяти / ОЗУ. .

Я также пробовал cdo merge, который, как ни странно, отлично работает для большинства конкатенаций, но некоторые файлы не работают и выводят эту ошибку Ошибка (cdf_put_vara_double): NetCDF: числовое преобразование не представляется возможным < / сильный>

Так есть ли способ объединить эти файлы, пока они все еще упакованы, или, по крайней мере, способ перепаковать большие файлы после их объединения?


person Jonathan Wille    schedule 17.07.2020    source источник
comment
Можете ли вы добавить ссылки на файлы, которые не работают?   -  person Robert Wilson    schedule 17.07.2020
comment
но пока я бы предложил добавить -f 32 к любой вашей команде cdo   -  person Robert Wilson    schedule 17.07.2020
comment
Конечно, @Robert, я загрузил сюда пару файлов. Когда я выполняю ncrcat для этих двух файлов, полученный файл будет иметь разные значения при переходе на следующий год drive.google.com/drive/folders/   -  person Jonathan Wille    schedule 17.07.2020
comment
Я быстро попробовал, чтобы cdo mergetime работал нормально с этими двумя файлами   -  person Robert Wilson    schedule 17.07.2020
comment
Верно, но я нашел два файла, в которых не работает cdo mergetime. Я загрузил их сюда. drive.google.com/drive/folders/   -  person Jonathan Wille    schedule 17.07.2020
comment
Хорошо, теперь я вижу проблему. Каждый файл в моем каталоге имеет разные add_offset и scale_factor. Таким образом, эти файлы невозможно объединить, пока они упакованы. Поэтому я могу использовать только распакованные файлы для объединения. Конечно, моя проблема в том, что я не могу перепаковать файлы, когда закончу, так как они такие большие. Итак, мое единственное решение - найти машину с большим объемом оперативной памяти, так как каждый распакованный файл занимает около 50 ГБ.   -  person Jonathan Wille    schedule 17.07.2020
comment
Спасибо. Я займусь этим. Я разрабатываю пакет python, который использует CDO в качестве бэкэнда (nctoolkit.readthedocs.io/en/latest), так что мне, наверное, нужно добавить к нему решение этой проблемы.   -  person Robert Wilson    schedule 17.07.2020
comment
Правда, изначально я использовал cdo -b F64 mergetime, но я обнаружил, что cdo -b F32 mergetime также работает и дает мне файлы вдвое меньше. Ваш пакет выглядит как очень полезный компаньон для пакета python netcdf. Удачи!   -  person Jonathan Wille    schedule 17.07.2020
comment
Спасибо. У него есть возможность изменить точность, но я могу просто оставить все как есть   -  person Robert Wilson    schedule 17.07.2020
comment
@RobertWilson Очевидно, что если вы объединяете файлы с очень разными значениями add_offset, то сохранение длины входных данных может привести к достаточной потере точности, о которой нужно заботиться, но в равной степени, если значения достаточно похожи, тогда это может быть хорошо. Имея это в виду, если вы реализуете эту функцию, было бы хорошо предложить пользователю выбор точности вывода. (Или, может быть, это то, о чем вы уже говорили?)   -  person alani    schedule 19.07.2020
comment
Пакет позволяет пользователям изменять точность вывода (nc.options(precision = whatever)), но, возможно, мне нужен способ проверки ансамблей на предмет смещения, упомянутого здесь. Хотя возможно, что это недостаточно распространено, чтобы его стоило реализовать.   -  person Robert Wilson    schedule 19.07.2020


Ответы (2)


Вместо того, чтобы переупаковывать большие файлы после их объединения, вы можете попробовать сжатие netCDF4, например,

ncpdq -U -7 -L 1 inN.nc in_upk_cmpN.nc # Loop over N
ncrcat in_upk_cmp*.nc out.nc

Удачи!

person Charlie Zender    schedule 18.07.2020

Когда данные упакованы, CDO часто выдает ошибку из-за слишком большой потери точности,

cdo -b32 mergetime in*.nc out.nc 

должен сделать свое дело и избежать ошибки. Если вы хотите затем сжать файлы, вы можете попробовать следующее:

cdo -z zip_9 copy out.nc out_compressed.nc 
person Adrian Tompkins    schedule 29.07.2020