来自: http://libitum.tk/blog/135.html

今天接了个小活儿,是从很多很多数据中提取出特定的一小部分出来,而这个“很多很多”的概念是千万条级别。这用mysql肯定是不行了,于是涉及了一个之前没有接触过的东西——Berkeley DB
Berkeley DB是一个高性能的、嵌入数据库编程库,简单到仅仅只支持最原始的Key/Value,然而速度确实相当相当快的,尤其是在对百万、千万级的数据进行索引时,效果相当的好。
但是使用BDB确实是件相当麻烦的事儿,试了好长时间终于才成功,于是闲着没事儿在几种语言下都试了下,说不定以后用得到。

先是python版

  1. import bsddb
  2.  
  3. db = bsddb.btopen('test.db', 'c')      #以普通的模式打开db文件
  4. #db = bsddb.hashopen('test.db', 'c')     #以hash的模式打开db文件
  5. db['2010-04-22'] = "Learn Berkeley DB"
  6. print db.items()
  7. db.close()

看上去依然很简洁,很有python的风范。不过这种写法是一种偷懒的写法,一些环境需要的临时文件会直接放在默认目录里。但是复杂的方法貌似有点太复杂了,就不提了…

再是perl版的

  1. use BerkeleyDB;
  2.  
  3. my $filename = "test.db";
  4. my $env = new BerkeleyDB::Env
  5.         -Flags  => DB_CREATE| DB_INIT_MPOOL
  6. || die "Cannot open environment: $BerkeleyDB::Error\n";
  7.  
  8. my $db = tie (%h, "BerkeleyDB::Btree",
  9.     -Filename => $filename,
  10.     -Flags => DB_CREATE,
  11.     -Env => $env)
  12. || die " Cannot open file $filename:$! $BerkeleyDB::Error\n";
  13.  
  14. for (my $i = 0; $i < 10; $i++) {
  15.         $h{$i} = $i*100;
  16. }
  17. while (($k, $v) = each(%h)) {
  18.     print "$k->$v\n";
  19. }

perl现在还在学,不是很熟,反正觉得挺怪异的~不过我最终可能还是要用perl来做的…
Oracle官方有关于perl使用BDB的内容,http://www.oracle.com/technology/documentation/berkeley-db/db/programmer_reference/ext_perl.html

最后是php版的

  1.     $db = new Db4();
  2.     $db->open(null, "/var/tmp/db4", "test.db");
  3.  
  4.     $counter = $db->get("counter");
  5.     print "Counter Value is $counter\n";
  6.  
  7.     $db->put("counter", $counter+1);
  8.     $db->sync();
  9. ?>

这也是个简单的例子,不过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


12-29 23:24