Вопрос об управлении памятью в jsoncpp - PullRequest
0 голосов
/ 04 мая 2020

Здравствуйте!

У меня вопрос по памяти с 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 () функция? После синтаксического анализа мне не нужно получать доступ к данным, чтобы очистить их?

Спасибо

...