我有大约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 ……)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。