perl - 数百万条目的 SQLite 优化?

标签 perl optimization sqlite berkeley-db

<分区>

我正在尝试使用 SQLite 数据库和 Perl 模块来解决问题。最后,我需要记录数千万条条目。每个项目的唯一唯一标识符是 URL 的文本字符串。我正在考虑以两种方式做到这一点:

方式#1:有好表、坏表、未排序表。 (我需要检查 html 并决定是否需要它。)假设我们总共有 10 亿个页面,每个表中有 3.33 亿个 URL。我有一个新的 URL 要添加,我需要检查并查看它是否在任何表中,如果它是唯一的,则将其添加到 Unsorted。此外,我会使用此选项移动很多行。

方式 #2:我有 2 个表,Master 和 Good。 Master 拥有全部 10 亿个页面 URL,而 Good 拥有我想要的 3.33 亿个。新的 URL,需要做同样的事情,除了这次我只查询一个表,我永远不会从 Master 中删除一行,只将数据添加到 Good。

所以基本上,我需要知道最佳设置以快速查询一个巨大的 SQLite 数据库以查看大约 20 个字符的文本字符串是否唯一,如果不是则添加。

编辑:我现在正在尝试让 Berkeley DB 使用 Perl 模块工作,但没有成功。这是我拥有的:

use BerkeleyDB;

$dbFolder = 'C:\somedirectory';
my $env = BerkeleyDB::Env->new ( -Home => $dbFolder );

my $db  = BerkeleyDB::Hash->new (
-Filename => "fred.db", 
-Env => $env );
my $status = $db->db_put("apple", "red");

当我运行它时,我得到以下信息:

Can't call method "db_put" on an undefined value at C:\Directory\perlfile.pl line 42, <STDIN> line 1.

最佳答案

我倾向于使用散列而不是 SQLite 来做您想做的事情。哈希经过优化以测试是否存在,而无需按任何排序顺序保留值,也无需在索引中保留数据的冗余副本。如果数据确实存在,则应用于数据的散列算法会产生数据的存储位置;你可以寻找那个位置,看看它是否在那里。我认为您不需要将哈希表保存在 RAM 中。

这里是您可以采用混合哈希/SQLite 方法的方法。

创建 SQLite 表

STORE
id INTEGER PRIMARY KEY
BUCKET (integer, indexed) 
URL (text, not indexed)
status 

如果您想让它们按状态分开,您可以拥有三个表,STORE1、STORE2 和 STORE3。

假设每家商店将有 250,000,001 个不同的存储桶。 (你可以试验这个数字;让它成为质数)。

找到一个哈希算法,它接受两个输入,URL 字符串和 250,000,0001,并返回 1 到 250,000,001 之间的一个数字。

当您获得一个 URL 时,将其提供给哈希算法,它会告诉您要查找的 BUCKET:

从 STORE 中选择 *,其中 BUCKET = {您的哈希函数返回的值}。

BUCKET 字段上的索引将快速返回行,您可以检查 URL。如果当前 URL 不是其中之一,则添加它:

INSERT STORE(BUCKET, URL) VALUES( {your hash return value}, theURL). 

SQLite 将索引整数值,我认为这比索引 URL 更有效。并且 URL 将只存储一次。

关于perl - 数百万条目的 SQLite 优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3807117/

相关文章:

multithreading - Perl错误: thread failed to start: Invalid value for shared scalar

regex - 为什么我只得到第一个捕获组?

java - UpdateString 未由 SQLite JDBC 驱动程序实现

mysql - 使用 Using temporary 解释 mysql performance 中的计划;使用文件排序;使用索引条件

c++ - 紧密循环中虚函数的成本

variables - Python select 存在带变量的 SQLite3

Java Android SQLite 字符串不等于它应该是什么

linux - Setuid Perl 脚本适用于 Solaris,但不适用于 Linux

perl - 如何将@ARGV 的第一个值与可能的选项数组匹配

database - 使用单个数据库与多个数据库时性能有提升吗?