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

0 ответов

Другие вопросы по тегам