【发布时间】:2010-09-27 19:27:20
【问题描述】:
我正在尝试通过使用 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 个字符的文本字符串是否唯一的最佳设置,如果不是,则添加。 p>
编辑:我现在正试图让 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),但您确定 SQLite 是处理这么多数据的最佳解决方案吗?
-
我从很多人那里听说 SQLite 非常适合处理大量数据。 stackoverflow.com/questions/3160987/…
-
对于大型数据集的最佳 SQLite 优化不是使用 SQLite。我从经验中知道,SQLite 会在一段时间后显着减慢插入速度。特别是如果您有不断重新计算的索引。 SQLite 的理论限制远远超出其实际限制。
-
我认为像 BerkeleyDB 这样的 DBM 对于这个应用程序来说会更快。使用您的字符串作为键,并使用 YAML 或 Storable 序列化所有其他数据。
-
实际上,我一直在努力让 BerkeleyDB 工作一段时间。我无法让它创建一个文件。我会发布我所拥有的,也许你可以帮助我。
标签: perl optimization sqlite berkeley-db