在python、perl、php中使用Berkeley DB (转)
时间:2010-07-30 来源:liukaiyi
来自: http://libitum.tk/blog/135.html
今天接了个小活儿,是从很多很多数据中提取出特定的一小部分出来,而这个“很多很多”的概念是千万条级别。这用mysql肯定是不行了,于是涉及了一个之前没有接触过的东西——Berkeley DB
Berkeley DB是一个高性能的、嵌入数据库编程库,简单到仅仅只支持最原始的Key/Value,然而速度确实相当相当快的,尤其是在对百万、千万级的数据进行索引时,效果相当的好。
但是使用BDB确实是件相当麻烦的事儿,试了好长时间终于才成功,于是闲着没事儿在几种语言下都试了下,说不定以后用得到。
先是python版
-
import bsddb
-
-
db = bsddb.btopen('test.db', 'c') #以普通的模式打开db文件
-
#db = bsddb.hashopen('test.db', 'c') #以hash的模式打开db文件
-
db['2010-04-22'] = "Learn Berkeley DB"
-
print db.items()
-
db.close()
看上去依然很简洁,很有python的风范。不过这种写法是一种偷懒的写法,一些环境需要的临时文件会直接放在默认目录里。但是复杂的方法貌似有点太复杂了,就不提了…
再是perl版的
-
use BerkeleyDB;
-
-
my $filename = "test.db";
-
my $env = new BerkeleyDB::Env
-
-Flags => DB_CREATE| DB_INIT_MPOOL
-
|| die "Cannot open environment: $BerkeleyDB::Error\n";
-
-
my $db = tie (%h, "BerkeleyDB::Btree",
-
-Filename => $filename,
-
-Flags => DB_CREATE,
-
-Env => $env)
-
|| die " Cannot open file $filename:$! $BerkeleyDB::Error\n";
-
-
for (my $i = 0; $i < 10; $i++) {
-
$h{$i} = $i*100;
-
}
-
while (($k, $v) = each(%h)) {
-
print "$k->$v\n";
-
}
perl现在还在学,不是很熟,反正觉得挺怪异的~不过我最终可能还是要用perl来做的…
Oracle官方有关于perl使用BDB的内容,http://www.oracle.com/technology/documentation/berkeley-db/db/programmer_reference/ext_perl.html
最后是php版的
-
<?php
-
$db = new Db4();
-
$db->open(null, "/var/tmp/db4", "test.db");
-
-
$counter = $db->get("counter");
-
print "Counter Value is $counter\n";
-
-
$db->put("counter", $counter+1);
-
$db->sync();
-
?>
这也是个简单的例子,不过php使用这个库要重新配置下的。php默认带的php_dba扩展虽然也支持BDB,但并不是很完善。
Oracle官方有关于php使用BDB的内容,http://www.oracle.com/technology/documentation/berkeley-db/db/programmer_reference/ext_php.html
先这样吧,等程序写完,再放一份完整的代码(可能是Perl的吧,虽然不是很喜欢这个语言)
Tags: perl, php, python