Лучший способ справиться с этим — разбить JSON — записать каждый объект верхнего уровня в отдельный файл. У вас уже есть метки для объектов, используйте их в качестве имен файлов с префиксом /config/
или /c/
, если вам нужно больше места для имени метки.
Давайте посмотрим, почему то, что вы просите от SPIFF, не работает.
JSON сериализуется для хранения в виде текста. Например, объект
{
label_0: {
label_a: "small string",
label_b: 1
},
label_1: {
label_c: "another string",
label_d: "more string"
}
}
сериализуется как
{"label_0":{"label_a":"small string","label_b":1},"label_1":{"label_c":"another string","label_d":"more string"}}
SPIFFS разбивает сохраненные файлы на страницы фиксированного размера. Он должен каждый раз записывать целую страницу во флэш-память - он не может просто записывать измененные байты; это не то, как работает флэш-память.
Предположим, что label_a
становится короче - просто "s"
. Тогда все после label_a
пришлось бы сдвигать в файле вниз. Чтобы SPIFFS сделал то, что вы просите, он должен написать страницу и помнить, что используется только часть страницы.
Если значение label_a
станет больше - "this is a much longer string"
то в файле все придется сдвигать вверх. SPIFFS должен был выделить новую страницу для хранения переполнения и помнить, что использовалась только ее часть.
Имейте в виду, что единственным способом, которым SPIFFS может запомнить, какие блоки используются, является запись этой информации во флэш-память.
Это слишком много для простой файловой системы.
Давайте также посмотрим на ситуацию. Насколько велик файл и как часто он записывается? Если у вас есть 1000 объектов, и каждый объект занимает, скажем, 200 байт для хранения, ваш JSON будет составлять около 20 000 байт. В среднем ESP8266 или ESP32 имеют 4 МБ флэш-памяти, из которых 1,5 МБ доступно для SPIFFS. Вы можете хранить 20 000 байт 75 раз в 1,5 МБ, поэтому у вас, вероятно, есть коэффициент около 75x или немного меньше для выравнивания износа.
Флэш-память в большинстве ESP8266 и ESP32 рассчитана на 100 000 операций записи (на практике она обычно длится намного дольше). Таким образом, с выравниванием износа вы, вероятно, могли бы записать файл размером 20 000 байт 750 000 раз, не ожидая появления ошибок.
Вы на самом деле собираетесь писать этот файл даже 1000 или 10 000 раз?
Если да, то это кажется странным сценарием для файла конфигурации, и вам следует переосмыслить, как вы работаете с этим файлом и что он делает.
Если нет, то это на самом деле не проблема.
person
romkey
schedule
03.09.2020