来自: 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版的
- $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的吧,虽然不是很喜欢这个语言)