• Haskell Посоветуйте, кто пользовался, хороший LRU для хаскеля (или как искать). При том, что скорее всего придётся немного допилить его API под конкретную нужду (а может взять и свой небольшой написать?).

    Паттерн использования такой: идёт поток ивентов, среди них нужно учитывать только последний по какому-то id-полю. То есть пока я думал сделать LRU-кеш, переписывая по этому самому id-полю значения, при удалении из LRU считать объект "конечным", также при окончании ивентов всё, что внутри LRU считать конечным.

Replies (13)

  • @kb, из разряда "от балды", а hackage.haskell.org с буффером в 1 сообщение не покатит?
  • @qrilka, Не очень понял о чём ты конкретно. Я пока думаю допилить hackage.haskell.org операцией insertWithCleanup чтоб при удалении элемента действие назначить можно было, вроде других LRU мапов вообще не нашёл.
  • @kb, кметту succint помогать дописать?
  • @kb, lru оно по определению List :) по сути я о том, что ести тебе нужен просто 1 последний, то и пиши мапу последних элементов да и всё, т.е. я не понял куда тебе тут буква L вообще
  • @qnikst, Да вроде succint — немного не то (хотя надо ещё раз в них будет влезть поразбираться, так я и не понял до конца реальности их применения для себя).
  • @qrilka, Мне нужен каждый последний по какому-то полю. То есть, конкретно, мне нужно считать время, проведённое пользователем на странице. Для этого он периодически шлёт пинги примерно такого вида:

    ```
    {"user_id": "qrilka", "impression_id": 123, "duration": 1000}
    {"user_id": "qrilka", "impression_id": 123, "duration": 2000}
    {"user_id": "qrilka", "impression_id": 123, "duration": 3000}
    ```

    При следующем заходе тебя на другую страницу будет то же самое, только другой impression_id.

    Так вот мне нужно из потока таких ивентов (для всех юзеров) по каждому impression_id оставить только последний. Т.к. люди не висят слишком долго на странице, LRU должен прекрасно подойти.
  • @kb, и в чём проблема держать мапу impression_id -> event? где хранить посл. ивент? или тебе надо ещё LRU не только по "глубине", но и по времени нахождения? Типа убивать через N минут нахождения?
  • @qrilka, Ну так я это и хочу. LRU для того, чтоб мапа не съела всю память (ивентов очень много), а лучше она пусть некоторые несколько раз посчитает (это в худшем случае).
  • @qrilka, если так, то храни время поступления и вычищай протухшие при доступе
  • @qrilka, Короче пока вот так буду делать github.com
  • @kb, ивентов много это совершенно пофиг если impression_id мало
  • @qrilka, impression_id много, конечно же.
  • @kb, ну напрямую, оно не то, но с ним можно эффективный lru cache сделать. Вроде на зурихаке мытались какие-то очереди тоже применимые для lru сделать. А так вроде один дурацкий пакет был.