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

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

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

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

В любом случае, перед выбором способа хранения данных на SD-карте, важно учесть объем данных, требуемые операции (чтение, запись, преобразование), а также доступные ресурсы (память, процессор).Выбрав подходящий метод, вы сможете эффективно сохранить и обработать большой объем данных на SD-карте.
Все зависит от того, какие типы данных в полях, постоянные ли они от строке к строке и много ли 'пустых' значений или точнее, значений с переменной длиной (строки например). <br/> <br/> Плюс, каким образом нужно проводить поиск данных, т.е. очевидно что читать все тебе последовательно не нужно, а значит нужно делать выборку по какому то условию. <br/> <br/> Ну еще, зависит от того, готов ли ты на накладные расходы потратить место на этой карте памяти. <br/> <br/> Теперь, если потелепатствовать, то используй простой формат с фиксированными размерами под данные. <br/> Проще говоря, фиксируешь размер памяти на каждую ячейку данных, фиксируешь количество и типы колонок в строке и получаешь классическую таблицу. <br/> <br/> Данные хранишь в файле так, как они хранятся в памяти ардуинки (особенно если они больше нигде использоваться не будут, ну или заранее продумай в каком формате числа будешь хранить <a href="https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D0%BA_%D0%B1%D0%B0%D0%B9%D1%82%D0%BE%D0%B2" rel="nofollow">BE/LE</a> . <br/> <br/> Каждая 'строка' в файле у тебя будет фиксированной длины (можно еще и выровнять на количество байт степени двойки, что оптимизирует операции умножения вычисления позиции, для ардуинки может быть актуально под какие то задачи) и разделители не нужны. Т.е. по номеру строки и номеру колонки можно высчитать смещение данных в файле простым умножением и сложением. <br/> <br/> Если нужны запросы по значению, пиши рядом индексный файл, где храни последовательность пар хеш_значения->номер_строки_в_файле, при этом если происходит коллизия, делай в этом файле еще записи с тем же хешем (рядом, чтобы пришлось делать только два лишнего чтение). Значения сортируй по хешу, поиск нужного значения делай тупой дихотомией (метод деления пополам или бинарный поиск) - как нашел значение, читай записи вверх, а потом вниз от него, пока есть коллизия хеша. <br/> <br/> Этот подход очень прост в реализации, не требует оперативной памяти от слова совсем (только буферы на работу с файловой системой), при хорошо подобранном хеше с малыми коллизиями, даст 'логарифм' чтений при поиске данных по значению, но не дает красиво править индекс и индексные данные (так как индекс нужно будет сортировать) т.е. подходит там где сами индексы и данные будут готовить на нормальном устройстве без дефицита ресурсов.
Похожие вопросы