Оптимизация проверки входящих строк на укникальность
От: MegaMozg Россия  
Дата: 28.05.22 16:11
Оценка:
Приветствую, коллеги. Интересует способ оптимизации следующей задачи:
С определенной периодичностью (допустим, раз в секунду) по сети приходит текстовая строка. Это строку мы помещаем в некую структуру (как значение поля в экземпляре класса) и пишем в БД. Суть проблемы: перед записью в БД эту строку нужно сравнить на уникальность со всеми предыдущими (сравнивать можно 5 последних символов – это уникальный хвост). Сравнение прямым перебором быстро приводит к потере производительности. Система должна работать сколько угодно времени и обрабатывать десятки тысяч строк. СУБД: SQLite или MS SQL
Re: Оптимизация проверки входящих строк на укникальность
От: scf  
Дата: 28.05.22 16:37
Оценка: +7
Здравствуйте, MegaMozg, Вы писали:

MM>Приветствую, коллеги. Интересует способ оптимизации следующей задачи:

MM>С определенной периодичностью (допустим, раз в секунду) по сети приходит текстовая строка. Это строку мы помещаем в некую структуру (как значение поля в экземпляре класса) и пишем в БД. Суть проблемы: перед записью в БД эту строку нужно сравнить на уникальность со всеми предыдущими (сравнивать можно 5 последних символов – это уникальный хвост). Сравнение прямым перебором быстро приводит к потере производительности. Система должна работать сколько угодно времени и обрабатывать десятки тысяч строк. СУБД: SQLite или MS SQL

Добавить уникальный констрейнт в базу?
Re: Оптимизация проверки входящих строк на укникальность
От: Muxa  
Дата: 28.05.22 17:37
Оценка: +3
Завести какой-нибудь [unordered] set, для хранения последних пяти символов и проверять перед сохранением.
Re[2]: Оптимизация проверки входящих строк на укникальность
От: Stanislav V. Zudin Россия  
Дата: 28.05.22 17:46
Оценка: +2
Здравствуйте, Muxa, Вы писали:

M>Завести какой-нибудь [unordered] set, для хранения последних пяти символов и проверять перед сохранением.


Причем, если символы однобайтные, то их можно засунуть в инт64 и ключ у хеша станет тривиальным.
_____________________
С уважением,
Stanislav V. Zudin
Re: Оптимизация проверки входящих строк на укникальность
От: kov_serg Россия  
Дата: 28.05.22 18:33
Оценка: 15 (2)
Здравствуйте, MegaMozg, Вы писали:

MM>Приветствую, коллеги. Интересует способ оптимизации следующей задачи:

MM>С определенной периодичностью (допустим, раз в секунду) по сети приходит текстовая строка. Это строку мы помещаем в некую структуру (как значение поля в экземпляре класса) и пишем в БД. Суть проблемы: перед записью в БД эту строку нужно сравнить на уникальность со всеми предыдущими (сравнивать можно 5 последних символов – это уникальный хвост). Сравнение прямым перебором быстро приводит к потере производительности. Система должна работать сколько угодно времени и обрабатывать десятки тысяч строк. СУБД: SQLite или MS SQL
фильтр Блума прикрутите.
Re: Оптимизация проверки входящих строк на укникальность
От: bnk СССР http://unmanagedvisio.com/
Дата: 28.05.22 21:47
Оценка: +2
Здравствуйте, MegaMozg, Вы писали:

MM>Приветствую, коллеги. Интересует способ оптимизации следующей задачи:

MM>С определенной периодичностью (допустим, раз в секунду) по сети приходит текстовая строка. Это строку мы помещаем в некую структуру (как значение поля в экземпляре класса) и пишем в БД. Суть проблемы: перед записью в БД эту строку нужно сравнить на уникальность со всеми предыдущими (сравнивать можно 5 последних символов – это уникальный хвост). Сравнение прямым перебором быстро приводит к потере производительности. Система должна работать сколько угодно времени и обрабатывать десятки тысяч строк. СУБД: SQLite или MS SQL

Выше написали, чем UNIQUE не нравится? База за тебя сама проверять будет, она это умеет.
Re: Оптимизация проверки входящих строк на укникальность
От: vaa  
Дата: 30.05.22 02:09
Оценка: +3
Здравствуйте, MegaMozg, Вы писали:

MM>Приветствую, коллеги. Интересует способ оптимизации следующей задачи:

MM>С определенной периодичностью (допустим, раз в секунду) по сети приходит текстовая строка. Это строку мы помещаем в некую структуру (как значение поля в экземпляре класса) и пишем в БД. Суть проблемы: перед записью в БД эту строку нужно сравнить на уникальность со всеми предыдущими (сравнивать можно 5 последних символов – это уникальный хвост). Сравнение прямым перебором быстро приводит к потере производительности. Система должна работать сколько угодно времени и обрабатывать десятки тысяч строк. СУБД: SQLite или MS SQL

добавить поле 5 символов. добавить UNIQUE INDEX
при вставке хвост новой строки копируете в это поле(или просто ищите есть или нет в базе).
если не вставляется значит не уникально.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Оптимизация проверки входящих строк на укникальность
От: Vzhyk2  
Дата: 30.05.22 06:06
Оценка:
MM>С определенной периодичностью (допустим, раз в секунду) по сети приходит текстовая строка. Это строку мы помещаем в некую структуру (как значение поля в экземпляре класса) и пишем в БД. Суть проблемы: перед записью в БД эту строку нужно сравнить на уникальность со всеми предыдущими (сравнивать можно 5 последних символов – это уникальный хвост). Сравнение прямым перебором быстро приводит к потере производительности. Система должна работать сколько угодно времени и обрабатывать десятки тысяч строк. СУБД: SQLite или MS SQL
для решения этой задачи используют хэши. А уж выбор конкретной реализации за тобой (уникальность, коллизии, поиска и хранения).
Re[2]: Оптимизация проверки входящих строк на укникальность
От: Vzhyk2  
Дата: 30.05.22 06:12
Оценка:
Здравствуйте, Vzhyk2, Вы писали:

MM>>С определенной периодичностью (допустим, раз в секунду) по сети приходит текстовая строка. Это строку мы помещаем в некую структуру (как значение поля в экземпляре класса) и пишем в БД. Суть проблемы: перед записью в БД эту строку нужно сравнить на уникальность со всеми предыдущими (сравнивать можно 5 последних символов – это уникальный хвост). Сравнение прямым перебором быстро приводит к потере производительности. Система должна работать сколько угодно времени и обрабатывать десятки тысяч строк. СУБД: SQLite или MS SQL

V>для решения этой задачи используют хэши. А уж выбор конкретной реализации за тобой (уникальность, коллизии, поиска и хранения).
Ну, а если у тебя последние 5 байт уникальны, то вот тебе готовый хэш на 40 бит (можешь поизвращаться и ужать до 32, например, или не страдать и отвести на хеш 64 бита).
Re[2]: Оптимизация проверки входящих строк на укникальность
От: Mr.Delphist  
Дата: 30.05.22 08:00
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>фильтр Блума прикрутите.


Как-то меня смущает:

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


Т.е. у топик-стартера приедет строка, блум скажет "оно есть" и отбросит. А в базе такого нет реально.
Re[2]: Оптимизация проверки входящих строк на укникальность
От: mogadanez Чехия  
Дата: 30.05.22 14:29
Оценка: 15 (1)
Здравствуйте, vaa, Вы писали:

vaa>добавить поле 5 символов. добавить UNIQUE INDEX

vaa>при вставке хвост новой строки копируете в это поле(или просто ищите есть или нет в базе).
vaa>если не вставляется значит не уникально.

более того можно например добавить ON DUPLICATE и увеличивать счетчик если нужно
Re[3]: Оптимизация проверки входящих строк на укникальность
От: Stanislav V. Zudin Россия  
Дата: 30.05.22 14:38
Оценка: +1 -1
Здравствуйте, Mr.Delphist, Вы писали:

MD>Т.е. у топик-стартера приедет строка, блум скажет "оно есть" и отбросит. А в базе такого нет реально.


После "оно есть" можно проверить наверняка. Отсеивает лишние (дорогие) обращения к субд.
_____________________
С уважением,
Stanislav V. Zudin
Re[2]: Оптимизация проверки входящих строк на укникальность
От: sergii.p  
Дата: 03.06.22 12:15
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>фильтр Блума прикрутите.


бессмысленное усложнение. Хэш функция на 5 символов, как уже было указано, даёт гарантированное отсутствие ложноположительных и отрицательных срабатываний. Да и хеш мапу не надо "прикручивать", она есть из коробки во многих языках. А фильтр Блума с ростом количества элементов в наборе будет всё чаще выдавать ложноположительные срабатывания. Короче, минусов много, плюсов не обнаружено.
Re[4]: Оптимизация проверки входящих строк на укникальность
От: flаt  
Дата: 03.06.22 13:18
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>Здравствуйте, Mr.Delphist, Вы писали:


MD>>Т.е. у топик-стартера приедет строка, блум скажет "оно есть" и отбросит. А в базе такого нет реально.


SVZ>После "оно есть" можно проверить наверняка. Отсеивает лишние (дорогие) обращения к субд.


У ТС сейчас ручная проверка плюс вставка в БД. Вы предлагаете добавить ещё третью проверку, после которой ещё раз проверять на наличие записи. Потому что ложноположительный ответ для ТС хуже, чем ложноотрицательный.
Re[5]: Оптимизация проверки входящих строк на укникальность
От: Stanislav V. Zudin Россия  
Дата: 03.06.22 13:30
Оценка:
Здравствуйте, flаt, Вы писали:

SVZ>>После "оно есть" можно проверить наверняка. Отсеивает лишние (дорогие) обращения к субд.


F>У ТС сейчас ручная проверка плюс вставка в БД. Вы предлагаете добавить ещё третью проверку, после которой ещё раз проверять на наличие записи. Потому что ложноположительный ответ для ТС хуже, чем ложноотрицательный.


Я вообще ничего не предлагаю
Я комментирую, зачем нужен Блум.
_____________________
С уважением,
Stanislav V. Zudin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.