Как сохранить большой объем данных на SD-карте так, чтобы их можно было легко прочитать?

Как можно более эффективно сохранить данные на карте для дальнейшего преобразования в массив? Пытался использовать JSON, но произошло переполнение памяти. Также пробовал CSV, однако использование библиотеки (CSV_Parser) потребовало слишком много памяти. Как можно преобразовать данные из файла на карте в массив более эффективным способом?
  • 29 февраля 2024 г. 15:19
Ответы на вопрос 2
Один из эффективных способов сохранения большого объема данных на SD-карте и их последующего чтения - использование бинарных файлов. В этом случае данные сохраняются в бинарном формате, что позволяет экономить память и ускоряет процесс чтения и записи. 

Для работы с бинарными файлами вам потребуется создать свой собственный формат данных, в котором будет указано, какие данные и в каком формате записаны в файле. После этого вы сможете записывать данные в файл и читать их обратно в вашу программу, преобразовывая их в нужный вам формат.

Другой эффективный способ - использование специализированных библиотек для работы с большими объемами данных, например, HDF5 или Apache Parquet. Эти библиотеки позволяют эффективно хранить и обрабатывать большие объемы данных, обеспечивая при этом высокую производительность.

В любом случае, перед выбором способа хранения данных на SD-карте, важно учесть объем данных, требуемые операции (чтение, запись, преобразование), а также доступные ресурсы (память, процессор).Выбрав подходящий метод, вы сможете эффективно сохранить и обработать большой объем данных на SD-карте.
Все зависит от того, какие типы данных в полях, постоянные ли они от строке к строке и много ли 'пустых' значений или точнее, значений с переменной длиной (строки например). 

Плюс, каким образом нужно проводить поиск данных, т.е. очевидно что читать все тебе последовательно не нужно, а значит нужно делать выборку по какому то условию.

Ну еще, зависит от того, готов ли ты на накладные расходы потратить место на этой карте памяти.

Теперь, если потелепатствовать, то используй простой формат с фиксированными размерами под данные.
Проще говоря, фиксируешь размер памяти на каждую ячейку данных, фиксируешь количество и типы колонок в строке и получаешь классическую таблицу.

Данные хранишь в файле так, как они хранятся в памяти ардуинки (особенно если они больше нигде использоваться не будут, ну или заранее продумай в каком формате числа будешь хранить BE/LE .

Каждая 'строка' в файле у тебя будет фиксированной длины (можно еще и выровнять на количество байт степени двойки, что оптимизирует операции умножения вычисления позиции, для ардуинки может быть актуально под какие то задачи) и разделители не нужны. Т.е. по номеру строки и номеру колонки можно высчитать смещение данных в файле простым умножением и сложением.

Если нужны запросы по значению, пиши рядом индексный файл, где храни последовательность пар хеш_значения->номер_строки_в_файле, при этом если происходит коллизия, делай в этом файле еще записи с тем же хешем (рядом, чтобы пришлось делать только два лишнего чтение). Значения сортируй по хешу, поиск нужного значения делай тупой дихотомией (метод деления пополам или бинарный поиск) - как нашел значение, читай записи вверх, а потом вниз от него, пока есть коллизия хеша.

Этот подход очень прост в реализации, не требует оперативной памяти от слова совсем (только буферы на работу с файловой системой), при хорошо подобранном хеше с малыми коллизиями, даст 'логарифм' чтений при поиске данных по значению, но не дает красиво править индекс и индексные данные (так как индекс нужно будет сортировать) т.е. подходит там где сами индексы и данные будут готовить на нормальном устройстве без дефицита ресурсов.
Похожие вопросы