Berkeley DB XML and python


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

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

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

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

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

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

  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3.  
  4. from bsddb.db import *
  5. from dbxml import *
  6.  
  7. mgr = XmlManager()
  8.  
  9. container = mgr.openContainer("demo.dbxml")
  10. container.addAlias("demo")
  11.  
  12. qc = mgr.createQueryContext()
  13.  
  14. results = mgr.query("collection('demo')/result", qc)
  15.  
  16. for value in results:
  17.     document = value.asDocument()
  18.     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


感谢您的关注。您现在可以 留言(0)留下通告地址



Leave a Reply

Note: Any comments are permitted only because the site owner is letting you post, and any comments will be removed for any reason at the absolute discretion of the site owner.

*
To prove you're a person (not a spam script), type the security word shown in the picture.
Anti-Spam Image