That's certainly one solution; and it's probably one we'll explore on our own. I'm hoping to find some papers or empirical evidence or existing implementations that do this, especially in the presence of multiple threads.
For the most part I keep coming to a serial number on each node of the hierarchy that represents a point in time for it and all ancestors. Any change in the ancestors them propagates serial number changes to all descendants, and the cache has a passive guard that compares the cached serial number with the incoming serial number. Ideally a way to eliminate the guard at the cache site itself would be ideal, but I haven't been able to think through an efficient and thread-safe way to do that active cache site flushing without a "stop the world" approach that would probably be too costly. I have a working implementation of a serial number-based per-node cache that appears to work reasonably well, but it does not propagate changes down the hierarchy. As a result, each guard has to walk all ancestors and calculate an aggregate serial number every time; this increases the cost of invalidating data cached out of a single-element hierarchy (probably more than I'm comfortable with) but works extremely well for reducing the cost of caching data out of a deep hierarchy (the deeper, the more savings, since the ancestor walk and serial number calculation is ultimately far cheaper than an ancestor walk plus a hash hit at each node). Matt Fowles wrote: > Charlie~ > > Why not simply have all the nodes of the tree cache their value and > put invalidate hooks that propagate mutation upwards. Then when any > node changes, it simply tells it dependent nodes that they must > invalidate their caches. This allows you to invalidate an entire > branch at touch, but doesn't require you to throw away everything. > > Matt > > On Tue, Sep 30, 2008 at 4:54 PM, Charles Oliver Nutter > <[EMAIL PROTECTED]> wrote: >> I'm looking for papers, references, descriptions of methodologies for >> caching data out of a mutable hierarchy. Anyone got some pointers? >> >> Basically in JRuby we have lots of untapped caching opportunities, for >> methods, "constants", class variables, and so on. All these caching >> opportunities tend to be stymied by the high mutability of Ruby's >> hierarchy. So I'm trying to boil the problem down to a more general space: >> >> 1. We wish to cache arbitrary data elements out of a hierarchy >> 2. The data elements in each node of the hierarchy are mutable, with >> mutations "affecting" all downstream nodes (in other words, the cached >> data is always looked up from the leaves to the trunk) >> 3. The structure of the hierarchy can be changed, adding single elements >> at arbitrary points (i.e. at any time new nodes can be inserted >> immediately between the current node and its "super" node). >> 4. The cache should be as fast as possible for access, with the >> acceptable tradeoff being a higher mutation cost. >> 5. The hierarchy could be bi-directional, but ideally that would not be >> a requirement. A secondary bi-dir hierarchy could be layered atop the >> original to avoid overt parent-to-child references. >> >> There has to be some prior work in this area, or a simple data structure >> I've overlooked. Finding such a structure would help caching efforts for >> most dynamic languages, but especially help Ruby. >> >> Any thoughts or pointers? >> >> - Charlie >> > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "JVM Languages" group. To post to this group, send email to jvm-languages@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/jvm-languages?hl=en -~----------~----~----~----~------~----~------~--~---