首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ecCodes (格里布读取库)没有释放内存

ecCodes (格里布读取库)没有释放内存
EN

Stack Overflow用户
提问于 2021-09-29 08:30:08
回答 1查看 140关注 0票数 2

我在我的项目中使用ecCodes库,我遇到了一个问题,就是在读取文件之间内存没有被释放。

表示问题的最小示例是(基本上是这两个库API使用示例[1](https://developer.qcloudimg.com/http-save/yehe-900000/7100068b7d28d949555dff42ef6a4d7e.png) [2]的组合)。

代码语言:javascript
复制
#include <string>
#include <vector>
#include <iostream>
#include "eccodes.h"

int main() {

    std::string filenames[] = {"../data/era5_model.grib", "../data/era5_model2.grib", "../data/era5_model3.grib",
                               "../data/era5_model4.grib"};

    std::vector<long> vec = {};

    for (auto & filename : filenames) {
        FILE* f = fopen(filename.c_str(), "r");
        int err = 0;
        codes_handle* h;

        while ((h = codes_handle_new_from_file(nullptr, f, PRODUCT_GRIB, &err)) != nullptr) {
            long k1 = 0;
            err = codes_get_long(h, "level", &k1);
            vec.push_back(k1);
        }

        codes_handle_delete(h);
        fclose(f);
    }

    std::cout << vec[52];

    return 0;
}

在本例中,程序读取4个相同的ERA5文件,每个文件大小为1.5GB。在打开新文件之前,上一个文件是用codes_handle_delete()和fclose()关闭的。因此,预期的行为是内存使用量保持在1.5GB左右。然而,在现实中,内存使用量稳步增加到6.5GB左右,并在程序关闭时释放(见下面的屏幕截图)。

这个特殊的例子已经在CLion上使用CMake (发布配置)运行,但是这个问题发生在每一个其他配置中,也出现在我的另一个使用FFI调用ecCodes的Rust项目中。

这个库似乎经过了很好的测试和支持,所以它不太可能是一个库错误。因此,这是一种预期的行为还是我的代码错了?如果是后者,我该如何纠正呢?

我使用的是Ubuntu21.04和带有apt的ecCodes 2.20.0

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-29 12:49:19

因此,我联系了图书馆的作者,并意识到我阅读这个例子不够仔细。

为了使ecCodes正确释放内存,每次创建内存时都应该删除codes_handle (类似于每次分配内存时应该如何释放内存)。因此,在我的示例中,codes_handle_delete()应该在while循环中:

代码语言:javascript
复制
while ((h = codes_handle_new_from_file(nullptr, f, PRODUCT_GRIB, &err)) != nullptr) {
    long k1 = 0;
    err = codes_get_long(h, "level", &k1);
    vec.push_back(k1);
    codes_handle_delete(h);
}   

在此之后,内存的使用几乎不明显。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69372954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档