rufus-lru
LruHash class, a Hash with a max size, controlled by a LRU mechanism.
getting it
gem install rufus-lru
or better, simply add to your Gemfile
gem 'rufus-lru'
usage
It's a regular hash, but you have to set a maxsize at instantiation.
Once the maxsize is reached, the hash will discard the element that was the least recently used (hence LRU).
require 'rufus-lru'
h = Rufus::Lru::Hash.new(3)
5.times { |i| h[i] = "a" * i }
puts h.inspect # >> {2=>"aa", 3=>"aaa", 4=>"aaaa"}
h[:newer] = 'b'
puts h.inspect # >> {:newer=>"b", 3=>"aaa", 4=>"aaaa"}
Rufus::Lru::Hash isn't thread-safe, if you need something that is, use Rufus::Lru::SynchronizedHash
require 'rufus-lru'
h = Rufus::Lru::SynchronizedHash.new(3)
# ...
It's possible to squeeze LruHash manually:
h = Rufus::Lru::Hash.new(33, :auto_squeeze => false)
# or
#h = Rufus::Lru::Hash.new(33)
#h.auto_squeeze = false
# ... values keep accumulating ...
# when a squeeze is needed...
h.squeeze!
LruHash accepts on initialization a :on_removal
option. It can be set to a Symbol, which is then used as the method name to call on the value just removed:
require 'rufus-lru'
class ObjectWithDestructor; def clear; puts 'Destructor called'; end; end
h = LruHash.new(1, :on_removal => :clear)
h[:one] = ObjectWithDestructor.new
h[:two] = nil # :one is being removed >> "Destructor called"
Or it can be set to a lambda:
require 'rufus-lru'
seen = []
h = Rufus::Lru::Hash.new(
1,
:on_removal => lambda { |val| seen << val.object_id })
h[:one] = 'abc'
h[:two] = 'xyz'
# seen ends up with the object_id of the 'abc' String instance...
The value of on_removal
can be set later on.
h.on_removal = :destroy
h.on_removal = lambda { |val| bodycount += 1 if val.is_a?(Martian) }
auto_squeeze
and on_removal
were originally contributed by Gleb Kuzmenko.
dependencies
None.
mailing list
On the rufus-ruby list:
http://groups.google.com/group/rufus-ruby
issue tracker
http://github.com/jmettraux/rufus-lru/issues
irc
irc.freenode.net #ruote
source
http://github.com/jmettraux/rufus-lru
git clone git://github.com/jmettraux/rufus-lru.git
author
John Mettraux, jmettraux@gmail.com, http://lambda.io/jmettraux
contributors and help
see CREDITS.txt
license
MIT