Class: LookupBy::Caching::LRU

Inherits:
Object
  • Object
show all
Defined in:
lib/lookup_by/caching/lru.rb,
lib/lookup_by/caching/lru_legacy.rb

Direct Known Subclasses

SafeLRU

Instance Method Summary collapse

Constructor Details

#initialize(max_size) ⇒ LRU

In Ruby 1.9+, Hash is ordered.

http://bugs.ruby-lang.org/issues/8312 In Ruby 2.0, Hash#shift is bugged and horribly slow.

require 'benchmark/ips'
hash, i, N = {}, 0, 20_000_000; while i < N; hash[i] = true; i += 1; end

Benchmark.ips do |x|
  x.report("shift") { hash.shift }
  x.report("first") { hash.delete hash.first[0] }
end
Ruby shift first
1.9.3-p484 264k 89k
1.9.3-p551 945k 370k
2.0.0-p0 0k 70k
2.0.0-p643 0k 272k
2.1.5 4947k 3557k
2.2.1 6801k 4457k
rbx-2.5.2 609k 409k


27
28
29
30
# File 'lib/lookup_by/caching/lru.rb', line 27

def initialize(max_size)
  @data = {}
  self.max_size = max_size
end

Instance Method Details

#[](key) ⇒ Object



40
41
42
43
44
45
# File 'lib/lookup_by/caching/lru.rb', line 40

def [](key)
  found = true
  value = @data.delete(key) { found = false }

  @data[key] = value if found
end

#[]=(key, value) ⇒ Object



47
48
49
50
51
# File 'lib/lookup_by/caching/lru.rb', line 47

def []=(key, value)
  @data.delete(key)
  @data[key] = value
  @data.shift if @data.length > @max_size
end

#clearObject



53
54
55
# File 'lib/lookup_by/caching/lru.rb', line 53

def clear
  @data.clear
end

#countObject



57
58
59
# File 'lib/lookup_by/caching/lru.rb', line 57

def count
  @data.length
end

#delete(key) ⇒ Object



61
62
63
# File 'lib/lookup_by/caching/lru.rb', line 61

def delete(key)
  @data.delete(key)
end

#eachObject



65
66
67
68
69
# File 'lib/lookup_by/caching/lru.rb', line 65

def each
  @data.to_a.each do |pair|
    yield pair
  end
end

#fetch(key) ⇒ Object



71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/lookup_by/caching/lru.rb', line 71

def fetch(key)
  found = true
  value = @data.delete(key) { found = false }

  if found
    @data[key] = value
  elsif block_given?
    value = @data[key] = yield key
    @data.shift if @data.length > @max_size
    value
  else
    raise KeyError, "key not found: %p" % [key]
  end
end

#key?(key) ⇒ Boolean

Returns:

  • (Boolean)


86
87
88
# File 'lib/lookup_by/caching/lru.rb', line 86

def key?(key)
  @data.key?(key)
end

#max_size=(size) ⇒ Object

Raises:

  • (ArgumentError)


32
33
34
35
36
37
38
# File 'lib/lookup_by/caching/lru.rb', line 32

def max_size=(size)
  raise ArgumentError.new(:maxsize) if size < 1

  @max_size = size

  @data.shift while @data.length > @max_size
end

#sizeObject



90
91
92
# File 'lib/lookup_by/caching/lru.rb', line 90

def size
  @data.size
end

#to_aObject



94
95
96
# File 'lib/lookup_by/caching/lru.rb', line 94

def to_a
  @data.to_a
end

#to_hObject



98
99
100
# File 'lib/lookup_by/caching/lru.rb', line 98

def to_h
  @data.dup
end

#valuesObject



102
103
104
# File 'lib/lookup_by/caching/lru.rb', line 102

def values
  @data.values
end