Allocate smaller amount of buffer for JSON (#3384)

This commit is contained in:
Janez Troha 2022-04-14 03:42:43 +02:00 committed by Jesse Hills
parent d5134e88b1
commit 2243021b58
No known key found for this signature in database
GPG key ID: BEAAE804EFD8E83A

View file

@ -23,13 +23,13 @@ std::string build_json(const json_build_t &f) {
#ifdef USE_ESP8266 #ifdef USE_ESP8266
const size_t free_heap = ESP.getMaxFreeBlockSize(); // NOLINT(readability-static-accessed-through-instance) const size_t free_heap = ESP.getMaxFreeBlockSize(); // NOLINT(readability-static-accessed-through-instance)
#elif defined(USE_ESP32) #elif defined(USE_ESP32)
const size_t free_heap = heap_caps_get_largest_free_block(MALLOC_CAP_INTERNAL); const size_t free_heap = heap_caps_get_largest_free_block(MALLOC_CAP_8BIT);
#endif #endif
const size_t request_size = std::min(free_heap - 2048, (size_t) 5120); const size_t request_size = std::min(free_heap, (size_t) 512);
DynamicJsonDocument json_document(request_size); DynamicJsonDocument json_document(request_size);
if (json_document.memoryPool().buffer() == nullptr) { if (json_document.capacity() == 0) {
ESP_LOGE(TAG, "Could not allocate memory for JSON document! Requested %u bytes, largest free heap block: %u bytes", ESP_LOGE(TAG, "Could not allocate memory for JSON document! Requested %u bytes, largest free heap block: %u bytes",
request_size, free_heap); request_size, free_heap);
return "{}"; return "{}";
@ -37,7 +37,7 @@ std::string build_json(const json_build_t &f) {
JsonObject root = json_document.to<JsonObject>(); JsonObject root = json_document.to<JsonObject>();
f(root); f(root);
json_document.shrinkToFit(); json_document.shrinkToFit();
ESP_LOGV(TAG, "Size after shrink %u bytes", json_document.capacity());
std::string output; std::string output;
serializeJson(json_document, output); serializeJson(json_document, output);
return output; return output;
@ -51,13 +51,13 @@ void parse_json(const std::string &data, const json_parse_t &f) {
#ifdef USE_ESP8266 #ifdef USE_ESP8266
const size_t free_heap = ESP.getMaxFreeBlockSize(); // NOLINT(readability-static-accessed-through-instance) const size_t free_heap = ESP.getMaxFreeBlockSize(); // NOLINT(readability-static-accessed-through-instance)
#elif defined(USE_ESP32) #elif defined(USE_ESP32)
const size_t free_heap = heap_caps_get_largest_free_block(MALLOC_CAP_INTERNAL); const size_t free_heap = heap_caps_get_largest_free_block(MALLOC_CAP_8BIT);
#endif #endif
bool pass = false; bool pass = false;
size_t request_size = std::min(free_heap - 2048, (size_t)(data.size() * 1.5)); size_t request_size = std::min(free_heap, (size_t)(data.size() * 1.5));
do { do {
DynamicJsonDocument json_document(request_size); DynamicJsonDocument json_document(request_size);
if (json_document.memoryPool().buffer() == nullptr) { if (json_document.capacity() == 0) {
ESP_LOGE(TAG, "Could not allocate memory for JSON document! Requested %u bytes, free heap: %u", request_size, ESP_LOGE(TAG, "Could not allocate memory for JSON document! Requested %u bytes, free heap: %u", request_size,
free_heap); free_heap);
return; return;