HDF5 (интерфейс C) потребляет всю оперативную память при повторных вызовах H5Oget_info_by_name

Я вижу странное поведение из моего кода HDF5 в C ++ (используя интерфейс C). Это максимизирует использование оперативной памяти в моей системе, но затем, кажется, продолжает работать просто отлично. Я не уверен, является ли совпадение моментом, когда он прекращает выделять больше оперативной памяти, или ожидаемым внутренним поведением некоторых буферов или чего-то подобного для этого. В любом случае проблема в том, что если некоторые Другой приложение хочет использовать некоторую оперативную память, тогда оно не может, и вся система начинает работать и зависает.

Я прогнал код через valgrind --tool=massif а также massif-visualizer чтобы попытаться увидеть, что происходит, и получить вывод ниже:

массив-visualizer_output

Просматривая цепочку вызовов в типичном снимке (отображаемом на изображении), кажется, что это происходит в одной из моих функций op_func, который неоднократно вызывается H5Literate когда я перебираю группу в файле HDF5, чтобы определить все наборы данных, которые он содержит.

Но эта функция даже не читает и не записывает какие-либо важные данные! Все, что он делает, это звонит H5Oget_info_by_name неоднократно запрашивать имена наборов данных! Так что я не понимаю, почему это должно занимать всю мою оперативную память. В случае, если я делаю что-то глупое, вот код для функции, которая неоднократно вызывается:

        inline herr_t op_func (hid_t loc_id, const char *name_in, const H5L_info_t *,
void *operator_data)
{
herr_t          return_val = 0;
H5O_info_t      infobuf;
std::vector<std::string> &od = *static_cast<std::vector<std::string> *> (operator_data);
std::string name(name_in);

H5Oget_info_by_name (loc_id, name.c_str(), &infobuf, H5P_DEFAULT);

switch (infobuf.type)
{
case H5O_TYPE_GROUP:
{
break;
}
case H5O_TYPE_DATASET:
{
std::string str(name);
if (name.find("_isvalid") == std::string::npos)
od.push_back(std::string(name));
break;
}
case H5O_TYPE_NAMED_DATATYPE:
break;
default:
break;
}

return return_val;
}

Как вы видите, это довольно просто, я просто собираю имена и помещаю их в вектор строк. Вероятно, он мог бы использовать более эффективную проверку ошибок, но, похоже, он прекрасно работает, если не считать проблемы с ОЗУ.

Я делаю что-то глупое, чтобы вызвать утечку памяти здесь? Или HDF5 ДЕЙСТВИТЕЛЬНО агрессивен в своей внутренней буферизации и буферизует намного больше информации, чем я понимаю? Возможно, мне просто нужно сказать это, чтобы очистить некоторые буферы или сделать сборку мусора или что-то?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]