реклама на сайте
подробности

 
 
> Быстрый доступ к элементу.
Jenya7
сообщение Oct 22 2017, 08:54
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Я получаю пакеты данных. Эти пакеты я должен хранить в RAM. Глубина хранения не определена но пока что это 512 пакетов.
То есть в RAM я создал массив 512 пакетов.
У каждого пакета есть два поля ID - ID1/ID2. Значения инденцификационных полей варьируются ID1=0-10000, ID2=0-255.
Мне приходит команда - добавь пакет 700/12, удали пакет 700/12, редактируй пакет 700/12. Команда приходит довольно часто - худший случай - каждую милисекунду поэтому время поиска элемента критично.
Проблема в быстром поиске пакета. Сделать хэш таблицу ID1-ID2 <=> индекс - громадная таблица получиться.
Сейчас к чему я пришел - самое оптимальное связанный список.
И тут я вспомнил работу с SQL базами данных - это ж просто праздник какой то. Добавляй, удаляй, редактируй записи сколько влезет и очень быстро.
В принципе это может быть non-SQL база данных - у меня всего одна таблица.
Есть реализация базы данных для эмбедед? кто нибудь видел такое? может даже реализовывал?

P.S. Погуглил эту тему. Вроде как советуют SQLLite. Но я не нашел примеров SQLLite для эмбеддед в С.

Сообщение отредактировал Jenya7 - Oct 22 2017, 09:02
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Rst7
сообщение Oct 22 2017, 09:36
Сообщение #2


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



QUOTE
1. Зачем хранить указатели на пакеты? Вместо них лучше индексы. Тогда один элемент таблицы поиска можно ужать до 32 бит:
log(10000)/log(2)+8+9 = 31бит


В данном случае это O(1).

QUOTE
ааа. то есть сортировать массив по ключу и делать бинарный поиск?


Конечно.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Oct 22 2017, 09:52
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Rst7 @ Oct 22 2017, 14:36) *
В данном случае это O(1).

Конечно.

Допустим у меня массив с ID 3 5 7 13 25 178 1355. Пришел ID 18. Я должен вставить его в свободное место и потом сортировать весь массив? А при удалении элемента сдвинуть все элементы влево?
Это займет много время.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 22 2017, 10:04
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Jenya7 @ Oct 22 2017, 12:52) *
Допустим у меня массив с ID 3 5 7 13 25 178 1355. Пришел ID 18. Я должен вставить его в свободное место и потом сортировать весь массив? А при удалении элемента сдвинуть все элементы влево?

Не в свободное место, а раздвинув существующие. И не все надо сдвигать, а от позиции нового пришедшего, до позиции удаляемого.

Цитата(Rst7 @ Oct 22 2017, 12:59) *
В данном случае за 3 сравнения (бинарным поиском) Вы находите место для вставки элемента с ID 18 (между 13 и 25). После чего Вам его просто нужно вставить (копирование трех элементов плюс запись нового). Массив остается отсортированным.

Исходить надо из случая заполненности всего массива (имеются все 512 кадров). И при старте делать инициализацию, заполнив первоначально массив недопустимыми индексами (с ID1 > 10000 например).
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Oct 22 2017, 10:07
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Rst7 @ Oct 22 2017, 14:59) *
В данном случае за 3 сравнения (бинарным поиском) Вы находите место для вставки элемента с ID 18 (между 13 и 25). После чего Вам его просто нужно вставить (копирование трех элементов плюс запись нового). Массив остается отсортированным.

копирование трех элементов плюс запись нового не получиться - таки надо раздвинуть.

Цитата(jcxz @ Oct 22 2017, 15:04) *
Не в свободное место, а раздвинув существующие. И не все надо сдвигать, а от позиции нового пришедшего, до позиции удаляемого.


Исходить надо из случая заполненности всего массива (имеется все 512 кадров). И при старте делать инициализацию, заполнив первоначально массив недопустимыми индексами (с ID1 > 10000 например).

то есть сдвинуть все элементы вправо от искомого. а при удалении все элементы влево от искомого.

наверно это все равно будет быстрее чем с несортированным массивом.

Сообщение отредактировал Jenya7 - Oct 22 2017, 10:09
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 22 2017, 10:18
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Jenya7 @ Oct 22 2017, 13:07) *
то есть сдвинуть все элементы вправо от искомого. а при удалении все элементы влево от искомого.

Я уже несколько раз написал - это можно сделать за одну операцию memmove(): сдвиг элементов в массиве поиска от добавляемого до удаляемого. Всего одна memmove.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Oct 22 2017, 10:32
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(jcxz @ Oct 22 2017, 13:18) *
. . . . это можно сделать за одну операцию memmove(): сдвиг элементов в массиве поиска от добавляемого до удаляемого. Всего одна memmove.

Это зависит от платформы ? - в смысле содержимого memmove() - аппаратная или программная реализация пересылки ?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 22 2017, 11:15
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(k155la3 @ Oct 22 2017, 13:32) *
Это зависит от платформы ? - в смысле содержимого memmove() - аппаратная или программная реализация пересылки ?

Я говорю о том, что не нужно дважды вызывать memmove(): сначала для удаления старой записи из массива поиска (и сжатия массива), а потом для раздвижки этого массива и вставки нового значения. Достаточно одного вызова memmove() для диапазона элементов от удаляемого до вставляемого.

Цитата(Jenya7 @ Oct 22 2017, 13:39) *
memmove() применяется к массиву в РАМ. Тут уж какя бы ни была платформа а функция должна взять каждый элемент и сдвинуть.

Если разговор о платформе Cortex-M и IAR, то внутри библиотечной memcpy() (и думаю что и memmove() тоже), копирование может идти с использованием нескольких регистров процессора (читается-пишется сразу по несколько 32-битных слов). См. дизасм.

Цитата(Rst7 @ Oct 22 2017, 13:59) *
Ну смотрите. Поиск будет занимать 9 сравнений. Считайте, что это бесплатно. Теперь memmove. Ну при хорошей реализации для ARM он примерно два байта за такт процессора пересылает (ну чуть меньше, чем два, но сейчас это пофиг).

Да ладно! Какой компилятор? IAR-овский memcpy() может использовать до 4х или даже 8и регистров (точно не помню) процессора для копирования.
Посчитайте сколько это байт. Конечно он предварительно смотрит на размер пересылки и, в зависимости от него, выбирает тот или иной цикл копирования.
Побайтно будет для ОЧЕНЬ маленьких размеров.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Jenya7   Быстрый доступ к элементу.   Oct 22 2017, 08:54
- - jcxz   Цитата(Jenya7 @ Oct 22 2017, 11:54) Пробл...   Oct 22 2017, 09:09
|- - Jenya7   Цитата(jcxz @ Oct 22 2017, 14:09) Сделайт...   Oct 22 2017, 09:20
- - Rst7   QUOTE И тут я вспомнил работу с SQL базами данных ...   Oct 22 2017, 09:14
|- - jcxz   Цитата(Rst7 @ Oct 22 2017, 12:14) Потому ...   Oct 22 2017, 09:33
|- - Jenya7   Цитата(jcxz @ Oct 22 2017, 14:33) 1. Заче...   Oct 22 2017, 09:48
|- - jcxz   Цитата(Jenya7 @ Oct 22 2017, 12:48) допус...   Oct 22 2017, 09:52
|- - k155la3   Цитата(Jenya7 @ Oct 22 2017, 12:48) . . ....   Oct 22 2017, 10:07
- - Rst7   QUOTE переберите все сочитания 0-10000 и 0-255. Уж...   Oct 22 2017, 09:28
|- - Jenya7   Цитата(Rst7 @ Oct 22 2017, 14:28) Вы не п...   Oct 22 2017, 09:34
|- - Jenya7   Цитата(jcxz @ Oct 22 2017, 15:18) Я уже н...   Oct 22 2017, 10:24
|- - Jenya7   Цитата(k155la3 @ Oct 22 2017, 15:32) Это ...   Oct 22 2017, 10:39
- - Rst7   QUOTE Допустим у меня массив с ID 3 5 7 13 25 178 ...   Oct 22 2017, 09:59
- - Rst7   QUOTE Исходить надо из случая заполненности всего ...   Oct 22 2017, 10:07
- - Rst7   А вообще-то для полной универсальности топикстарте...   Oct 22 2017, 10:09
|- - Jenya7   Цитата(Rst7 @ Oct 22 2017, 15:09) А вообщ...   Oct 22 2017, 10:16
|- - Rst7   QUOTE (Jenya7 @ Oct 22 2017, 13:16) это к...   Oct 22 2017, 10:47
|- - Jenya7   Цитата(Rst7 @ Oct 22 2017, 15:47) Еще раз...   Oct 22 2017, 10:49
|- - Rst7   QUOTE (Jenya7 @ Oct 22 2017, 13:49) Посмо...   Oct 22 2017, 11:33
|- - Jenya7   Цитата(Rst7 @ Oct 22 2017, 16:33) Ну если...   Oct 22 2017, 11:38
- - Rst7   QUOTE а я понял. ну вот в этом вопрос - насколько ...   Oct 22 2017, 10:59
- - Rst7   QUOTE Да ладно! Какой компилятор? IAR-овский m...   Oct 22 2017, 11:22
|- - jcxz   Цитата(Rst7 @ Oct 22 2017, 14:22) Итого з...   Oct 22 2017, 11:31
- - Jenya7   Rst7, jcxz. Большое вам спасибо. Сделаю так. Вооб...   Oct 22 2017, 11:30
- - Rst7   QUOTE вы говорите на больших размерах можно подума...   Oct 22 2017, 11:41
|- - Jenya7   Цитата(Rst7 @ Oct 22 2017, 16:41) Даже не...   Oct 22 2017, 12:37
- - Jenya7   хотел уточнить такой вопрос для вставки Кодmemmove...   Oct 23 2017, 11:36
- - Rst7   QUOTE получается я должен добавить отступ? Нет. Н...   Oct 23 2017, 13:16
|- - Jenya7   Цитата(Rst7 @ Oct 23 2017, 19:16) Нет. На...   Oct 23 2017, 13:24
- - Rst7   QUOTE но а+2 не будет адресом элемента a[2]. Что ...   Oct 23 2017, 14:04
|- - Jenya7   Цитата(Rst7 @ Oct 23 2017, 20:04) Что зна...   Oct 23 2017, 14:35
- - XVR   Советую отделить id от data и хранить id+индекс в ...   Oct 23 2017, 21:16
|- - Jenya7   Цитата(XVR @ Oct 24 2017, 02:16) Советую ...   Oct 24 2017, 06:23
- - ViKo   Высказываю идею. Пока пакетов меньше 1024 (чисто п...   Oct 24 2017, 07:43
- - Jenya7   Результаты такие. При добавлении элемента я вылета...   Oct 24 2017, 07:44
|- - ViKo   Цитата(Jenya7 @ Oct 24 2017, 10:44) так я...   Oct 24 2017, 08:05
- - skripach   Цитата(Jenya7 @ Oct 22 2017, 11:54) масси...   Oct 24 2017, 07:55
- - Jenya7   Нашел проблемку. Функция вставки в причесанном вар...   Oct 24 2017, 08:41
- - Rst7   Ну правильно вот так CODEmemcpy(messages...   Oct 24 2017, 10:09
|- - Jenya7   Цитата(Rst7 @ Oct 24 2017, 15:09) Ну прав...   Oct 24 2017, 11:12
- - Rst7   QUOTE не совсем понимаю. memmove переносит из адре...   Oct 24 2017, 11:41
|- - Jenya7   Цитата(Rst7 @ Oct 24 2017, 16:33) Вы пере...   Oct 24 2017, 11:43
- - Rst7   QUOTE ммм...а можете показать как. я не понимаю на...   Oct 24 2017, 11:57
|- - Jenya7   Цитата(Rst7 @ Oct 24 2017, 16:57) Обновит...   Oct 24 2017, 12:07
- - Rst7   Ну и чисто эстетический момент. Лично меня вымораж...   Oct 24 2017, 12:10
|- - Jenya7   Цитата(Rst7 @ Oct 24 2017, 17:10) Ну и чи...   Oct 24 2017, 12:17
- - Jenya7   по моему в КодTEST_MESSAGE *AllocMessage(void...   Oct 26 2017, 07:34
- - Rst7   QUOTE Элементы вставляются но p->data всех элем...   Oct 26 2017, 08:00
|- - Jenya7   Цитата(Rst7 @ Oct 26 2017, 14:00) Ээээ, т...   Oct 26 2017, 09:23
|- - Rst7   QUOTE (Jenya7 @ Oct 26 2017, 12:23) Да. Н...   Oct 26 2017, 09:47
|- - Jenya7   Цитата(Rst7 @ Oct 26 2017, 15:47) Я так з...   Oct 26 2017, 10:39
- - Rst7   Я не понимаю, что Вы смотрите. Все поля msg_p[i].p...   Oct 26 2017, 11:29
- - Jenya7   Цитата(Rst7 @ Oct 26 2017, 16:29) Что печ...   Oct 26 2017, 11:36


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 19:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01532 секунд с 7
ELECTRONIX ©2004-2016