Size: a a a

Rust — русскоговорящее сообществo

2020 March 13

VL

Vladimir Luss in Rust — русскоговорящее сообществo
всем привет.
есть задача: хранить в памяти несколько десятков миллионов строк произвольной длины (плюс, условно, уникальный идшник им соответствующий) и проверять поток входящих ивентов (15к епс) на предмет присутствия в них этих строк.

я сейчас взял для этого дела indexmap (https://docs.rs/indexmap/1.3.2/indexmap/), но возник вопрос: может умные люди что-то более подходящее подскажут для этого дела?
источник

VL

Vladimir Luss in Rust — русскоговорящее сообществo
набор строк может меняться динамически, так что время на создание этой структуры имеет значение
скорее даже в первую очередь имеет значение время построения/изменения, во вторую - потребление памяти, в третью - скорость поиска по ней (но полный перебор не подойдет)
источник

NL

Nikita Lesnikov in Rust — русскоговорящее сообществo
Vladimir Luss
набор строк может меняться динамически, так что время на создание этой структуры имеет значение
скорее даже в первую очередь имеет значение время построения/изменения, во вторую - потребление памяти, в третью - скорость поиска по ней (но полный перебор не подойдет)
источник

VL

Vladimir Luss in Rust — русскоговорящее сообществo
я, может, заблуждаюсь, но разве ахо корасик это не наоборот оверхед на добавление/удаление строк?
там же дерево надо строить
источник

NL

Nikita Lesnikov in Rust — русскоговорящее сообществo
Vladimir Luss
я, может, заблуждаюсь, но разве ахо корасик это не наоборот оверхед на добавление/удаление строк?
там же дерево надо строить
Да, там оффлайн построение, но поиск оптимален. Просто не очень понятно из описания, насколько все динамично - может раз в какое-то время можно автомат перестраивать. Построение в AC простое за линейное время.
источник

VL

Vladimir Luss in Rust — русскоговорящее сообществo
Nikita Lesnikov
Да, там оффлайн построение, но поиск оптимален. Просто не очень понятно из описания, насколько все динамично - может раз в какое-то время можно автомат перестраивать. Построение в AC простое за линейное время.
ну я выше писал, что приоритет на добавление/удаление строк и на объем, так что перестраивать каждый раз, пожалуй, не вариант.
источник

NL

Nikita Lesnikov in Rust — русскоговорящее сообществo
Ну тогда просто trie без suffix links, подходит под описание по идее. Правда не уверен, что есть в виде готового крейта.
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Vladimir Luss
всем привет.
есть задача: хранить в памяти несколько десятков миллионов строк произвольной длины (плюс, условно, уникальный идшник им соответствующий) и проверять поток входящих ивентов (15к епс) на предмет присутствия в них этих строк.

я сейчас взял для этого дела indexmap (https://docs.rs/indexmap/1.3.2/indexmap/), но возник вопрос: может умные люди что-то более подходящее подскажут для этого дела?
Я не очень понял. Надо для каждого события понять, входит ли оно в набор? Или что какая-то его подстрока входит в набор?
источник

VL

Vladimir Luss in Rust — русскоговорящее сообществo
Mikail Bagishov
Я не очень понял. Надо для каждого события понять, входит ли оно в набор? Или что какая-то его подстрока входит в набор?
стрикт матч
источник

VL

Vladimir Luss in Rust — русскоговорящее сообществo
Mikail Bagishov
Я не очень понял. Надо для каждого события понять, входит ли оно в набор? Или что какая-то его подстрока входит в набор?
т.е. хэшмап подходит вполне, но че-т они не слишком быстро строятся и кушают памяти прилично
хотя может так и должно быть
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Vladimir Luss
т.е. хэшмап подходит вполне, но че-т они не слишком быстро строятся и кушают памяти прилично
хотя может так и должно быть
Тогда да, строй бор (aka trie).
источник

VL

Vladimir Luss in Rust — русскоговорящее сообществo
Mikail Bagishov
Тогда да, строй бор (aka trie).
окей, сейчас почитаю, спасибо за советы )
источник

Э

Эрик in Rust — русскоговорящее сообществo
Денис Котляров
интересное введение этот ваш matches!(foo, 'A'..='Z' | 'a'..='z')

но кажется если компоновать это с if, выйдет что-то странное...

if matches!(foo, 'A'..='Z' | 'a'..='z') {}

1. выполнить работу аналога match и вернуть true/false
2. сравнить что это true или false?:) (что-то в обычном match такого вроде нету)

или есть более адекватные пути применения?)
Некий enum без PartialEq, чтобы в тестах вместо assert_eq!(a, MyVariant(b)) писать assert!(matches!(a, MyVariant(B))). Например.
источник

AT

Alexander Tchitchigin in Rust — русскоговорящее сообществo
Mikail Bagishov
Тогда да, строй бор (aka trie).
Ещё bloom filter может помочь. Но это не точно.
источник

AT

Alexander Tchitchigin in Rust — русскоговорящее сообществo
Либо bloom filter поставить перед trie для скорости.
источник

NL

Nikita Lesnikov in Rust — русскоговорящее сообществo
Из блум фильтра удалять не очень)
источник

MF

Max Frai in Rust — русскоговорящее сообществo
Подскажите над реализацией. Есть веб-сервис, к нему приходит запрос с каким-то параметром.
Есть какая-то логика в другом потоке, которая относительно долго отрабатывает (пару секунд).
Когда на сервис приходит запрос, нужно отправить новую задачу этой логике и ждать результата.
Как правильно должна быть устроена логика, как она должна принимать задачи и оповещать об окончении и готовности результатов для “подписчиков”
источник

AT

Alexander Tchitchigin in Rust — русскоговорящее сообществo
Nikita Lesnikov
Из блум фильтра удалять не очень)
А из trie? 😉
источник

IB

Ivan Boldyrev in Rust — русскоговорящее сообществo
Alexander Tchitchigin
А из trie? 😉
А из trie O(n) от длины строки. Быстрее ты даже хэш не посчитаешь.
источник

Э

Эрик in Rust — русскоговорящее сообществo
А смысл удалять?
источник