注意:我试图找到特定LRU算法的名称,而不是这是一个缓存算法(我知道它是,我写的)。告诉我这是一个缓存算法就像告诉某人寻找红黑树这个名称它是树平衡算法。
我最近创建了以下算法,但我相当肯定有人必须在我之前完成此操作并为其命名。这对任何人来说都很熟悉吗?
目的:保持一个固定大小的字符串池以及它们被看到的次数。如果池超过最大大小,则仅保留最近使用的项目。
伪代码:
var cur
var old
func add_key(key)
if cur not defined
put a hash in cur
if key in old
copy value from old to cur for this key
delete key from old
increment cur[key]
if there are too many keys in cur
replace old with cur
empty cur
copy value from old to cur for this key
delete key from old
return cur[key]
Perl 5中的一个简单实现如下:
#!/usr/bin/perl
use strict;
use warnings;
{ package Fixed::LRU::Counter;
sub new {
my ($class, $max) = @_;
return bless {
max => $max,
cur => {},
old => {},
}, $class;
}
sub add_key {
my ($self, $k) = @_;
if ($self->{old}{$k}) {
$self->{cur}{$k} = $self->{old}{$k};
delete $self->{old}{$k};
}
$self->{cur}{$k}++;
if (keys %{$self->{cur}} > $self->{max}) {
$self->{old} = $self->{cur};
$self->{cur} = { $k => $self->{old}{$k} };
delete $self->{old}{$k};
}
return $self->{cur}{$k};
}
}
my $c = Fixed::LRU::Counter->new(3);
for my $k (qw/a a b c d e f f g a f/) {
print "$k: ", $c->add_key($k), "\n";
}
答案 0 :(得分:4)
Least frequently used cache algorithm
它不是LRU,因为LRU按照上次访问时间对缓存项目进行排序,而不是像您那样按访问次数排序。
答案 1 :(得分:1)
这不是可以用于缓存或页面文件的实现吗?
它适用于最新的方法,有其他策略,如删除最少使用,删除最新等等。
答案 2 :(得分:0)
肯定不是MRU,但也不是LRU。同时使用cur
和old
会让您看起来像是在尝试使用old
作为驱逐缓冲区。
但是,您管理cur
的方式并非真正的LRU 或 MRU - 当您的缓存已满时,您仍然需要仅新条目,并将整个其余内容抛出到逐出缓存(old
)。通常情况下,添加条目会使缓存太大,您可以选择一个现有缓存条目以丢弃(如果您正在使用一个缓存条目,则退出到驱逐缓冲区)。通过你抛弃整个事物的方式,我想你可以称之为"而不是最近使用的带有驱逐缓冲区的缓存"。
然而,说实话,我认为可能使用更短,更简单的名称:"错误"。我想可能会有一些情况,在这种情况下,这将会/将/确实运行良好,但至少它看起来/听起来像一个非常糟糕的主意。
缓存的基本思想是,如果最近使用了某些东西,它可能会很快再次使用。但是,在这种情况下,您几乎完全在任意时间(几乎)清空整个缓存。如果您知道关于数据访问的批次,那么可能有意义,并且知道您倾向于加载N个数据项并使用它们很长一段时间,但是当您加载时项目N + 1,您可能不再使用之前的N个项目,因此您可以将它们全部清除,并在错误时将其恢复为驱逐缓冲区。 / p>