Unidata / netcdf-cxx4

Official GitHub repository for netCDF-C++ libraries and utilities.
Other
126 stars 49 forks source link

netCDF::exceptions::NcHdfErr after calling getVar too often #127

Open campagn1 opened 1 year ago

campagn1 commented 1 year ago

Dear all, I move here the issue opened by Dimitri Sotnik in the netcdf-c project 8 months ago https://github.com/Unidata/netcdf-c/issues/2241

Hope you can help.

HDF5 version: 1.8.13

Hi everybody, working here on an ns2 simulator, which is using netCDF 4.7.3 (tried also 4.8.1) / netcdf-cxx4-4.3.1, and we encounter a limitation on reading our HDF5 files. The database is called on every transmission. So the amount is quite large. After calling it around 570000 times during the run netCDF crashes with following exception:

terminate called after throwing an instance of 'netCDF::exceptions::NcHdfErr'
what(): NetCDF: HDF error
file: ncVar.cpp line:1537

Heres a small c++ example which can reproduce the behaviour. i tried different nc Files, getting the same result.

#include <netcdf.h>
#include <ncFile.h>
#include <ncVar.h>

std::string path_;
netCDF::NcFile *netcdf_db;
netCDF::NcVar netcdf_LocMat;
netCDF::NcVar netcdf_ValueMat;

bool openNetCdfDb();

void closeNetCdfDb();

int main() {

srand (0);
int64_t count = 0;
path_ = (char *) ("../FILE.nc");

while (1) {
    if (openNetCdfDb()) {

            std::cout << "count " << count++ << std::endl;
            netcdf_LocMat = netcdf_db->getVar("LocMat");
        netcdf_ValueMat = netcdf_db->getVar("ValueMat");

            double x, y,result;

            for (uint i = 0; i < 9; i++) {
                netcdf_LocMat.getVar({0, i}, &x);
                netcdf_LocMat.getVar({1, i}, &y);
                for (uint j = 0; j <= 70; j++) {
                    netcdf_ValueMat.getVar({i, j}, &result);
                    std::cout << "x " << x << " y " << y << " value " << result << std::endl;
                }
            }

    }
    closeNetCdfDb();
}
return 0;
}
bool openNetCdfDb() {
  if (netcdf_db == NULL) {
    std::cout << " openNetCdfDb(): Opening file " << path_ << std::endl;
    netcdf_db = new netCDF::NcFile(path_, netCDF::NcFile::read);
    if (netcdf_db != NULL) {
        std::cout << "opened" << std::endl;
        return true;
    }
    return false;
  }

  return true;
}
void closeNetCdfDb() {
  if (netcdf_db != NULL) {
    delete netcdf_db;
    netcdf_db = NULL;
    std::cout << "closed" << std::endl;
  }
}
MetalKnight commented 12 months ago

Update: