POP Article V2.0 设为主页
收藏本站
首 页交流论坛留 言
您现在的位置:首 页 >> 热门开源项目 >> Berkeley DB >> 查看文章
Berkeley DB XML and python
作者:MG个人技术博客  来源:www.sqlite.com.cn  时间:2008-2-8  【 字体: 】 〖 双击滚屏 〗

Berkeley DB XML and python


Berkeley DB XML是一种原生的XML数据库,它允许将XML文档内容直接存储在数据库中。

由此,我想可以用它来存储一些简单的、不经常更新的、但是要求快速查询的数据。

我们通过一个简单的例子来说明,如何针对Berkeley DB XML来存储XML文档:

  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. from bsddb.db import *
  4. from dbxml import *
  5. mgr = XmlManager()
  6. uc = mgr.createUpdateContext()
  7. container = mgr.openContainer("demo.dbxml", DB_CREATE)
  8. filename = 'demo'
  9. fileContents = """<?xml version="1.0" encoding="UTF-8"?>
  10. <result>OK</result>
  11. """
  12. container.putDocument(filename, fileContents, uc)

在这个例子中,会创建一个名为demo.dbxml的数据库文件。

相应的,我们读取刚刚存储的内容,可以使用:

  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. from bsddb.db import *
  4. from dbxml import *
  5. mgr = XmlManager()
  6. container = mgr.openContainer("demo.dbxml")
  7. container.addAlias("demo")
  8. qc = mgr.createQueryContext()
  9. results = mgr.query("collection('demo')/result", qc)
  10. for value in results:
  11.     document = value.asDocument()
  12.     print document.getName(), "=", value.asString()

在实际应用过程中,发现当大量数据同时插入的时候,会产生类似以下的错误:

Traceback (most recent call last):
File "D:\robots\collection\tag_to_dbxml.py", line 27, in ?
tagdb.savebydbxml(ls[3], [ cate_id , cate_name])
File "D:\robots\collection\mgRobots\mgTags.py", line 49, in savebydbxml
self.container.putDocument(filename, fileContents, self.uc)
File "C:\Python24\Lib\site-packages\dbxml.py", line 259, in putDocument
def putDocument(*args): return _dbxml.XmlContainer_putDocument(*args)
_dbxml.XmlDatabaseError: (5, 'Error: DB_PAGE_NOTFOUND: Requested page not found'
)

后来发现,需要在

container.putDocument(filename, fileContents, uc)

后面增加

container.sync()

究其原因,我想可能是没有同步造成页面文件(或者索引文件)没有生成的原因。不过,发现增加该语句后虽然能够不断增加新的数据,但是几百K的数据写入的速度非常慢。]

使用索性提高性能
正常情况下查询我做的TAGS列表样例数据库的时候,发现查询速度居然在2657.04ms到1443.64ms之间,但是在建立索引之后,居然提高到5.477ms到3.581ms,感觉提升的也太夸张了。

具体操作方法如下(使用dbxml命令行实现):

  1. dbxml> openContainer tags4house.dbxml
  2. dbxml> setVerbose 2 2
  3. dbxml> addIndex "" context unique-node-element-equality-string
  4. dbxml> query 'collection()/tag[context="a"]/context'

其中:

  1. 打开数据库文件
  2. 设置显示处理的过程(这样才能看到运行时间)
  3. 添加索引,具体可以参考安装后参考文档中的《Chapter 7. Using BDB XML Indices》中的内容;
  4. 查询

参考书籍
《Getting Started with XQuery》Part1 , Part2

浏览次数:   【 打 印 】【 关 闭
上一篇:Python读写Berlekey DB XML的例子
下一篇:[转帖]Python 性能剖分工具
 论坛登陆
用户名:
密  码:
验证码: 
Cookie 选项:
正常登陆 隐身登陆
   
没有注册?
 文章搜索
 推荐文章
 酷站推荐
 热门文章
 网站统计
关于我们 | 网站地图 | 联系我们 | 网站历史 | 友情链接 | TOP
Copyright© 2006 Sqlite中文社区  程序开发: mistletoe  站长: 林轩 陈文成