2015-10-19 5 views
1

Я использую библиотеку netcdf из UCAR для создания файла netCDF. Команда для создания файла netCDF находится здесь: https://www.unidata.ucar.edu/software/netcdf/docs/netcdf-c/nc_005fcreate.htmlЗапись сжатых файлов с помощью nc_create

Если я использую флажки NC_NETCDF4 | NC_CLASSIC_MODEL в nc_create, создаст ли сжатый файл netCDF?

+0

Что он выводит? Слово «сжать» не отображается в вашей ссылке, и значения, задокументированные для аргумента 'int cmode', также не указывают на это. –

+1

Сжатие NetCDF4 задается на переменном уровне. Прочтите https://www.unidata.ucar.edu/software/netcdf/docs/netcdf-c/nc_005fdef_005fvar_005fdeflate.html#nc_005fdef_005fvar_005fdeflate – Chiel

ответ

1

Сжатие задается в переменных, а не в файле, используя функцию nc_def_var_deflate. Я использовал пример с сайта Unidata (и удалил проверки ошибок, чтобы сделать его доступным для чтения здесь, mea culpa). Что вы можете сделать, так это играть с параметром deflate_level, чтобы увидеть разницу в размере файла. Не ожидайте чудес, мой опыт в том, что вы в основном получаете порядка 10-20 процентов.

#include <cstdlib> 
#include <netcdf.h> 

#define NDIMS 1 
#define NX 102400 

int main() 
{ 
    int ncid, x_dimid, varid; 
    double* data_out = new double[NX]; 

    for (int x=0; x<NX; ++x) 
     data_out[x] = (double)(std::rand())/RAND_MAX; 

    nc_create("test.nc", NC_CLOBBER | NC_NETCDF4, &ncid); 

    nc_def_dim(ncid, "x", NX, &x_dimid); 

    nc_def_var(ncid, "data", NC_DOUBLE, NDIMS, &x_dimid, &varid); 
    int shuffle = 1; 
    int deflate = 1;  // This switches compression on (1) or off (0). 
    int deflate_level = 8; // This is the compression level in range 1 (less) - 9 (more). 
    nc_def_var_deflate(ncid, varid, shuffle, deflate, deflate_level); 
    nc_enddef(ncid); 

    nc_put_var_double(ncid, varid, data_out); 
    nc_close(ncid); 

    delete[] data_out; 

    return 0; 
} 
+0

спасибо @Chiel, это помогает. Нужно ли мне модифицировать код для чтения в сжатом файле netCDF? – user308827

+1

Нет, библиотека позаботится об этом. См. FAQ: http://www.unidata.ucar.edu/software/netcdf/docs/faq.html#fv9 – Chiel

+0

По сравнению с классическими файлами моделей сжатые файлы в моем конкретном случае составляли порядка 25% от оригинал, поэтому он может быть значительным. Вы можете проверить возможные уровни сжатия с помощью команды nccopy, например: nccopy -4 -d 9 -s -u infile.nc outfile.nc – kakk11

Смежные вопросы