加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在Perl中快速查找:可以重新加载哈希值吗?

发布时间:2020-12-15 23:28:29 所属栏目:大数据 来源:网络整理
导读:我有大约1亿行,例如: A : value of AB : value of B|||Z : value of Z upto 100 million unique entries 目前,每次运行程序时,我都会将整个文件作为哈希加载,这需要一些时间.在运行期间,我需要访问A,B的值,因为我知道A,B等. 我想知道我是否可以进行一次哈希
我有大约1亿行,例如:

A : value of A
B : value of B
|
|
|
Z : value of Z  upto 100 million unique entries

目前,每次运行程序时,我都会将整个文件作为哈希加载,这需要一些时间.在运行期间,我需要访问A,B的值,因为我知道A,B等.

我想知道我是否可以进行一次哈希并将其存储为二进制数据结构或索引文件.使用最少的编程可以在perl中实现什么.

谢谢!
-Abhi

解决方法

我建议使用磁盘上的键/值数据库.由于Perl的 tie function,它们可以与正常的内存中哈希相同地使用.如果哈希非常大,它们将比Perl的哈希读/写更快,并且它们支持自动保存/加载到磁盘.

BerkeleyDB是最受欢迎的:

use BerkeleyDB;
# Make %db an on-disk database stored in database.dbm. Create file if needed
tie my %db,'BerkeleyDB::Hash',-Filename => "database.dbm",-Flags => DB_CREATE
    or die "Couldn't tie database: $BerkeleyDB::Error";

$db{foo} = 1;            # get value
print $db{foo},"n";    # set value
for my $key (keys %db) {
    print "$key -> $db{$key}n";  # iterate values
}

%db = ();  # wipe

对数据库的更改将自动保存到磁盘,并将通过多次调用脚本而持续存在.

检查perldoc的选项,但最重要的是:

# Increase memory allocation for database (increases performance),e.g. 640 MB
tie my %db,-Filename => $filename,-CacheSize => 640*1024*1024;

# Open database in readonly mode
tie my %db,-Flags => DB_RDONLY;

一个更复杂但更快的数据库库是Tokyo Cabinet,当然还有很多其他选项(毕竟这是Perl ……)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读