Здравствуйте!
У меня вопрос по памяти с jsoncpp. Я должен загрузить большой JSon файл (55 МБ) в C ++ с jsoncpp. Я заметил, что моя программа использует много оперативной памяти. Я пытался что-то, просто открыть, разобрать и закрыть файл JSON. После закрытия файла использование памяти вообще не уменьшалось.
Я также пытался с Rapid Json и после возврата освобождается много памяти.
Я использую Linux
Я попробовал этот код, который печатает файл statm в / proc / PID / statm до и после Jsoncpp анализа. Он печатает память до, во время и после функции синтаксического анализа.
#include <iostream>
#include <json/json.h>
#include <fstream>
#include <unistd.h>
#include <iostream>
#include <json/json.h>
#include <fstream>
#include <unistd.h>
#include <rapidjson/istreamwrapper.h>
#include <rapidjson/document.h>
void printmem()
{
char tmp[128];
std::string t;
sprintf(tmp, "/proc/%d/statm", getpid());
std::ifstream ifs(tmp);
std::getline(ifs, t);
std::cout << t <<"\n";
ifs.close();
}
void jsoncpp()
{
std::ifstream ifs("../../../AlloDB/db.json");
Json::CharReaderBuilder builder;
Json::Value value;
JSONCPP_STRING errs;
Json::parseFromStream(builder, ifs, &value, NULL);
ifs.close();
printmem();
}
void rapid_json()
{
using namespace rapidjson;
std::ifstream ifs("../../../AlloDB/db.json");
std::string t;
IStreamWrapper isw(ifs);
Document d;
d.ParseStream(isw);
printmem();
}
int main(int argc, char** argv)
{
printmem();
//jsoncpp();
rapid_json();
printmem();
}
Результат: Для jsoncpp
2552 629 516 51 0 188 0
107744 106364 1052 51 0 105380 0
107744 106364 1052 51 0 105380 0
Таким образом, до анализа, общая памятка используется 2552 * 4096 + / - = 10 МБ. Во время и после использования функции память строго одинакова 107744 * 4096 + / - = 420 МБ.
Для Rapid Json:
2552 642 530 51 0 188 0
24275 22871 1056 51 0 21911 0
4140 2780 1056 51 0 1776 0
Rapid Json бесплатно много память, но не etire.
Jsoncpp должен освободить память после возвращения jsoncpp (), не так ли? Я пробовал Valgrind с этой программой (с jsoncpp), и утечки памяти нет.
==133628== Memcheck, a memory error detector
==133628== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==133628== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
==133628== Command: bin/Debug/db
==133628==
50448 39807 1539 498 0 47403 0
649572 639457 1671 498 0 646527 0
440676 431819 1671 498 0 437631 0
==133628==
==133628== HEAP SUMMARY:
==133628== in use at exit: 0 bytes in 0 blocks
==133628== total heap usage: 5,917,609 allocs, 5,917,609 frees, 601,544,185 bytes allocated
==133628==
==133628== All heap blocks were freed -- no leaks are possible
==133628==
==133628== For lists of detected and suppressed errors, rerun with: -s
==133628== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Почему jsoncpp не освобождает память при возврате jsoncpp () функция? После синтаксического анализа мне не нужно получать доступ к данным, чтобы очистить их?
Спасибо