在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 bsddbdb = 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
相关阅读 更多 +