操作和存储大量有序列表或哈希的最佳方法是什么?

时间:2009-04-27 17:50:44

标签: performance perl

我有一个简单的有序列表,可能包含100万或更多项目。此列表只执行了一些操作:

  • 在值中查找
  • 找到值的索引
  • 查找索引值
  • 添加值
  • 获取列表中的项目数

将值添加到列表后,它永远不会更改。我将项目附加到列表中,没有插入或删除。

我需要操纵这个大清单,并持久存储它。现在我正在使用数据库Int =>用于表示列表的字符串,但我认为应该有一种更有效的方法来实现。

我可以使用memcached,但我认为缺少2个函数:

  • 持久存储
  • 找到值的索引

2 个答案:

答案 0 :(得分:6)

您似乎还需要String -> Int映射表。

在Perl中,最简单的方法是tie DBM文件的哈希值(参见man perltie)。

未经测试的示例代码几乎肯定会得到改进:

use DB_File;
tie %value2index, 'DB_File', 'value2index';
tie %index2value, 'DB_File', 'index2value';

sub index_count() {
    return scalar %value2index;
}

sub value_exists() {
    my $value = shift;
    return exists($value2index{$value});
}

sub append() {
    my $value = shift;
    if (!value_exits($value)) { # prevent duplicate insertions
        my $index = index_count() + 1;
        $value2index{$value} = $index;
        $index2value{$index} = $value;
    }
}

sub find_index() {
    my $value = shift;
    return $value2index{$value};
}

sub find_value() {
    my $index = shift;
    return $index2value{$index};
}

不要在多线程环境中使用它,这里有非原子操作。

答案 1 :(得分:0)

你的物品有多大?你介意用多少记忆?你的物品是独一无二的吗?

你可能会逃避这样的事情:

my @list; # This keeps the ordered list
my %keyval; # This maps key to value
my %valkey; # This maps value to key
每个插页上的

push @list, value;
$valkey{$value} = $#list;
$keyval{$#list} = $value;

并满足您的每一项要求:

#Existence of a value:
if(exists($valkey{$value}));

#Existence of an index;
if(exists($keyval{$index}));

#value for an index:
$keyval{$index};

#value for a key:
$valkey{$value};

#Size
$#list;