views:

486

answers:

3

I want a data structure that will allow querying how many items in last X minutes. An item may just be a simple identifier or a more complex data structure, preferably the timestamp of the item will be in the item, rather than stored outside (as a hash or similar, wouldn't want to have problems with multiple items having same timestamp).

So far it seems that with LINQ I could easily filter items with timestamp greater than a given time and aggregate a count. Though I'm hesitant to try to work .NET 3.5 specific stuff into my production environment yet. Are there any other suggestions for a similar data structure?

The other part that I'm interested in is aging old data out, If I'm only going to be asking for counts of items less than 6 hours ago I would like anything older than that to be removed from my data structure because this may be a long-running program.

+1  A: 

I think that an important consideration will be the frequency of querying vs. adding/removing. If you will do frequent querying (especially if you'll have a large collection) a B-tree may be the way to go:

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

You could have some thread go through and clean up this tree periodically or make it part of the search (again, depending on the usage). Basically, you'll do a tree search to find the spot "x minutes ago", then count the number of children on the nodes with newer times. If you keep the number of children under the nodes up to date, this sum can be done quickly.

dmo
+2  A: 

A simple linked list can be used for this.

Basically you add new items to the end, and remove too old items from the start, it is a cheap data structure.

example-code:

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

If the list will be busy enough to warrant chopping off larger pieces than one at a time, then I agree with dmo, use a tree structure or something similar that allows pruning on a higher level.

Lasse V. Karlsen
+1  A: 

a cache with sliding expiration will do the job ....

stuff your items in and the cache handles the aging ....

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

ehosca