Как уместить базу данных в 10 килобайт памяти и не сойти с ума

09 июл 2026
2,862
564
63
2 недели

Представьте, что вы пишете прошивку для датчика полива или умного замка. У вас в распоряжении микроконтроллер с крошечным объемом Flash-памяти и еще меньшим запасом RAM. Ставить полноценную базу данных — безумие, писать свои велосипеды для хранения настроек и логов в сырых секторах памяти — мучение, которое обычно заканчивается битыми данными после очередного отключения питания.

Я наткнулся на FlashDB, когда искал способ хранить историю показаний сенсоров без боли. Это проект от разработчика armink, и он решает ровно две задачи: хранение пар «ключ-значение» (KV) и работу с временными рядами (Time Series). Все это работает прямо на Flash-чипах и весит сущие копейки.

Что это вообще такое

FlashDB — это встраиваемая база данных для эмбеддед-систем. Она работает по принципу NoSQL и заточена под специфику Flash-памяти: учитывает ограниченное количество циклов перезаписи и необходимость стирать память блоками.

Основная фишка в том, что автор не стал раздувать проект. Здесь нет SQL-парсеров, сложных транзакций или сетевого стека. Зато есть поддержка почти всех популярных типов Flash: от встроенной в MCU до внешней SPI Flash.

Две стороны одной медали

Библиотека разделена на два больших модуля, и чаще всего вам понадобятся оба.

Реклама

KVDB: прощай, EEPROM

Обычно настройки хранят в структурах и пишут в EEPROM или эмуляцию на Flash. Проблема возникает, когда настроек становится много или они меняются в разных версиях прошивки.

FlashDB позволяет просто сохранять объекты по именам. Она поддерживает автоматическое управление версиями: если вы обновили прошивку и структура данных изменилась, база может сама разобраться с миграцией. Это экономит кучу времени при поддержке парка устройств.

TSDB: логи без страданий

Если вам нужно записывать температуру каждые 5 минут, FlashDB предлагает режим временных рядов. Данные пишутся последовательно, что идеально ложится на физику Flash-памяти.

Главное удобство — встроенный механизм очистки. Вы задаете максимальный объем логов, и база сама затирает старые записи, когда место заканчивается. Больше не нужно считать смещения секторов вручную, чтобы не затереть код программы или важные конфиги.

Как это выглядит в коде

Для работы с базой нужно сначала инициализировать объект. Вот пример того, как просто сохранить и прочитать значение:

/* Указываем имя таблицы и путь (если есть файловая система) */
static struct fdb_kvdb kvdb = { 0 };

void user_data_init(void) {
    fdb_kvdb_init(&kvdb, "env", "fdb_kvdb1", NULL, NULL);
}

void save_config(int brightness) {
    fdb_kv_set_int(&kvdb, "brightness", brightness);
}

int load_config(void) {
    int brightness = 0;
    fdb_kv_get_int(&kvdb, "brightness", &brightness);
    return brightness;
}

Все максимально лаконично. Для временных рядов логика похожая, только вместо ключей используются временные метки.

Почему это стоит попробовать

Я выделил несколько моментов, которые отличают FlashDB от типичного «костыля на коленке»:

  1. Бережное отношение к железу. Алгоритмы записи минимизируют износ Flash-памяти. Это критично, если ваше устройство должно прожить 5-10 лет без замены чипа.
  2. Невероятная компактность. Библиотека требует около 10 КБ Flash и меньше 1 КБ RAM. Она влезет даже в старенькие STM32F103 или дешевые китайские аналоги.
  3. Готовность к сбоям. Если питание пропадет в момент записи, структура базы останется целостной. Для промышленных или уличных устройств это маст-хэв.
  4. Кроссплатформенность. Есть готовые порты под RT-Thread, FreeRTOS и даже «голое железо» через слой абстракции FAL (Flash Abstraction Layer).

Архитектурные нюансы

FlashDB не работает в вакууме. Под капотом она опирается на библиотеку FAL от того же автора. Это слой, который говорит базе: «по адресу 0x0800C000 у нас сектор на 4 КБ».

Если вы используете RT-Thread, интеграция займет пару минут. Если у вас чистый C на каком-нибудь AVR или ESP32 без RTOS, придется чуть-чуть дописать функции работы с драйвером Flash, но API там интуитивно понятное.

Где это применить

В моей практике FlashDB идеально подходит для:

  • Хранения сетевых настроек (SSID, пароли, токены) в IoT-устройствах.
  • Логирования ошибок и состояний системы для последующей диагностики.
  • Сбора статистики работы оборудования, которую потом нужно выгрузить по Bluetooth или Wi-Fi.
  • Хранения калибровочных коэффициентов датчиков.

Вердикт

Проект живой, у него почти 3 тысячи звезд на GitHub и активное сообщество. Да, документация местами заставляет использовать Google Translate с китайского, но кода там больше, чем текста, а примеры в папке samples покрывают 90% задач.

Если вы устали от того, что при добавлении одной переменной в конфиг у вас «едет» вся разметка памяти, FlashDB определенно стоит того, чтобы потратить на неё вечер. Это тот редкий случай, когда инструмент действительно упрощает жизнь эмбеддед-разработчика, не требуя взамен гору ресурсов.

Начать можно прямо с репозитория на GitHub, там есть подробная инструкция по быстрой установке.

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.