Сведения о вопросе

Henry

12:46, 23rd August, 2020

Теги

c#   linq   .net-3.5   data-structures    

Структура данных старения в C#

Просмотров: 434   Ответов: 3

Мне нужна структура данных, которая позволит запрашивать, сколько элементов за последние X минут . Элемент может быть просто простым идентификатором или более сложной структурой данных, предпочтительно timestamp элемента будет находиться в элементе, а не храниться снаружи (как hash или аналогичный, не хотелось бы иметь проблемы с несколькими элементами, имеющими одинаковый timestamp).

До сих пор кажется, что с LINQ я мог бы легко фильтровать элементы с timestamp больше, чем заданное время и агрегировать количество. Хотя я не решаюсь попробовать работать .NET 3.5 конкретных вещей в моей производственной среде пока нет. Есть ли другие предложения для подобной структуры данных?

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



  Сведения об ответе

pumpa

03:19, 29th August, 2020

Для этого можно использовать простой связанный список.

В основном вы добавляете новые элементы в конце и удаляете слишком старые элементы с самого начала, это дешевая структура данных.

пример кода:

list.push_end(new_data)
while list.head.age >= age_limit:
    list.pop_head()

Если список будет достаточно занят, чтобы гарантировать отрубание больших кусков, чем по одному за раз , то я согласен с dmo, используйте древовидную структуру или что-то подобное, что позволяет обрезать на более высоком уровне.


  Сведения об ответе

lourence

05:56, 15th August, 2020

кэш с скользящим сроком действия будет выполнять эту работу ....

поместите свои элементы, и кэш обрабатывает старение ....

http://www.sharedcache.com/cms/


  Сведения об ответе

DO__IT

20:59, 11th August, 2020

Я думаю, что важным соображением будет частота запросов против adding/removing., если вы будете делать частые запросы (особенно если у вас будет большая коллекция), B-дерево может быть способом пойти:

http://en.wikipedia.org/wiki/B-tree

Вы могли бы иметь некоторый поток пройти и очистить это дерево периодически или сделать его частью поиска (опять же, в зависимости от использования). В принципе, вы сделаете поиск дерева, чтобы найти место "x минут назад", а затем подсчитаете количество детей на узлах с более новыми временами. Если вы держите количество детей под узлами в актуальном состоянии, эта сумма может быть сделана быстро.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться