为什么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)。
我正在使用 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)。