gpt4 book ai didi

database - Perl:在磁盘上存储一个巨大的散列有问题吗?

转载 作者:搜寻专家 更新时间:2023-10-30 19:48:25 24 4
gpt4 key购买 nike

我正在从事一个 Perl 项目,该项目涉及使用大约 1700 万个键构建散列。这太大而无法存储在内存中(我的笔记本电脑的内存只能容纳大约 1000 万个 key )。我知道解决方案是将数据存储在磁盘上,但我在实践中遇到了麻烦。这是我尝试过的:

数据库文件

use strict;
use DB_File;
my $libfile = shift;
my %library;
tie %library, "DB_File", "$libfile";
for (my $a = 1; $a < 17000000; a++) {
# Some code to generate key and value #
$library{$key} = $value;
}

由于我不明白的原因,这给了我一个段错误:循环中的 11 部分。

BerkeleyDB

use strict; 
use BerkeleyDB;
my $libfile = shift;
my $library = new BerkeleyDB::Hash
-Filename => $libfile,
-Flags => DB_CREATE;

for (my $a = 1; $a < 17000000; a++) {
# Some code to generate key and value #
$library->db_put($key, $value);
}

这似乎对前 1500 万个 key 运行良好,但随后速度急剧下降,最终在循环结束时完全停止。我不认为这是一个内存问题;如果我将循环分成四部分,将它们放在四个单独的程序中,然后按顺序运行它们(每次向数据库添加约 400 万条记录),前三个成功完成,但第四个在数据库有大约 15 个时挂起万把 key 。所以看起来 BerkeleyDB 可能只能处理散列中的约 1500 万个键???

DBM::深

use strict; 
use DBM::Deep;
my $libfile = shift;
my $library = new DBM::Deep $libfile;

for (my $a = 1; $a < 17000000; a++) {
# Some code to generate key and value #
$library->put($key => $value);
}

从初步测试来看,这似乎工作正常,但它真的很慢:每千个键大约 5 秒,或者运行整个循环大约 22 小时。如果可能的话,我宁愿避免这种情况。

如果您能提供有关对其中一个软件包进行故障排除的建议,或者有关完成同一件事的其他选项的想法,我将不胜感激。

更新

最佳答案

切换到 btree 可能会提高以“键排序模式”访问的 HUGE BerkeleyDB 的性能。它减少了所需的磁盘 I/O 操作数。

案例研究:在 news:comp.mail.sendmail 中报道的一个案例中,我记得巨大的 BerkeleyDB 创建时间从散列的几个小时减少到带有“键排序”附加的 btree 的 20 分钟。无论如何,它太长了,所以这个人决定切换到能够直接访问 SQL 数据库的软件,避免将 SQL 数据库“转储”到 BerkeleyDB 的需要。 (virtusertable, sendmail->postfix)

关于database - Perl:在磁盘上存储一个巨大的散列有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21769319/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com