为什么nlohmann不释放内存

Why nlohmann does not release memory

我正在使用 nlohmann 库来解析 JSON 代码。 我们有两个问题:
1-为什么nlohmann使用巨大的内存来解析数据
2- 在像下面的代码这样的本地函数中调用解析器后,它不会释放内存。 我的 JSON 数据大小约为 8MB,解析器使用的数据超过 50MB 进行解析。我解析了这个 JSON 数据 10 次,内存使用量上升到 600MB 之后函数执行完毕内存未释放

#include "nlohmann/json.hpp"

    #define REPEAT 10

        void GenerateNlohmann() {
          std::string filePath{FILE_ADDRESS};
          std::ifstream iFile(filePath.c_str(), std::ios::in);
          std::string data{};
          if (iFile.is_open()) {
            data = std::string((std::istreambuf_iterator<char>(iFile)),
                               std::istreambuf_iterator<char>()); // About 8MB size
            iFile.close();
          }
          if (!data.empty()) {
            nlohmann::json json = nlohmann::json::parse(data); // Use memory about 50MB
            std::vector<nlohmann::json> jsons{};
            for (int i = 0; i < REPEAT; ++i) {
              nlohmann::json j = nlohmann::json::parse(data);
              jsons.emplace_back(j);
            }
            while (!jsons.empty()) {
              jsons.pop_back();
            }
          }
        }

            int main() {
              GenerateNlohmann();

        // Now memory usage is about 600MB
              std::cout << "Input a numberto exit" << std::endl;
              int i;
              std::cin >> i;

              return 0;
            }

我在 ubuntu 重现成功。 我的 json 数据大小约为 1.4 KB,但我多次解析此 json 数据。 这是我的测试结果:

在运行之前:

KiB Mem :  8167476 total,  5461204 free,   284120 used,  2422152 buff/cache

1000 times:
KiB Mem :  8167476 total,  5456600 free,   288724 used,  2422152 buff/cache

10000 times:
KiB Mem :  8167476 total,  5405916 free,   339376 used,  2422184 buff/cache

100000 times:
KiB Mem :  8167476 total,  4893176 free,   852104 used,  2422196 buff/cache

After input the int (After run)
KiB Mem :  8167476 total,  5462208 free,   283116 used,  2422152 buff/cache

确实有问题,但这是分配器的优化(在我的情况下可能是 glibc)并且与图书馆。

如果我在我的代码中添加 malloc_trim(0)

while (!jsons.empty()) {
      jsons.pop_back();
    }

+   malloc_trim(0);
  }

我会发现一切都会好起来的。 在windows中我们不能重现,因为我们使用的不是glibc,我想。

其他测试: 我已经用 glibc 编写了其他程序来 malloc 许多小内存,但问题仍然 alive.My 程序与库无关,它只是 malloc 并释放许多小内存。

总之,问题与图书馆无关。 如果我们在库中加入malloc_trim(0),解析的时候会调用很多次,这样会减少performance.So 更好的解决方案是在代码中添加 malloc_trim(0)