Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
campagn1 opened this issue Nov 30, 2022 · 1 comment
Open

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

campagn1 opened this issue Nov 30, 2022 · 1 comment

Comments

@campagn1
Copy link

Dear all, I move here the issue opened by Dimitri Sotnik in the netcdf-c project 8 months ago Unidata/netcdf-c#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
Copy link

MetalKnight commented Oct 9, 2023

Update:

  • upgrading to HDF5 1.14.2 and to NetCDF-C 4.9.2 fixed the HDF error

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants