一起添加多个ZODB数据库

时间:2013-08-19 20:06:16

标签: python database zodb

我有三个python对象数据库,我是通过ZODB模块构建的,我想将它合并为一个。我有三个而不是一个的原因是因为每个对象属于三个群体中的一个,并且一旦我的代码对所述对象进行分析就被添加到数据库中。每个对象的分析绝对可以并行完成。我的代码需要几天才能运行,所以为了防止这是一周的努力,我有三台计算机,每台计算机处理来自三个群体之一的对象,并在完成后输出一个ZODB数据库。由于ZODB处理冲突的方式,我无法让三台计算机将来自不同人群的对象分析添加到相同的数据库。基本上,在关闭数据库之前,它会从内部锁定。

我的问题是: 1)如何将多个.fs数据库文件合并到一个主数据库中?每个数据库的结构完全相同 - 意味着每个数据库之间的字典结构是相同的。例如,MyDB可能代表第一个群体的ZODB数据库结构:

root.['MyDB']['ID123456']['property1']
        ...  ['ID123456']['property2']
        ...       ...        ...

root.['MyDB']['ID123457']['property1']
        ...  ['ID123457']['property2']
        ...       ...        ...

... 

其中省略号表示更多相同。密钥'property1','property2'等的名称对于数据库中的每个'IDXXXXXX'密钥都是相同的,尽管这些值会有所不同。

2)并行运行此代码同时仍然会产生单个ZODB结构的更聪明的做法是什么?

如果需要澄清,请告诉我。

谢谢!

2 个答案:

答案 0 :(得分:1)

更聪明的做法是使用ZEO在进程间共享ZODB存储。

ZEO在网络上共享一个ZODB数据库,并将冲突解决方案扩展到多个客户端,这些客户端可以驻留在同一台机器上或其他地方。

或者,您可以使用RelStorage backend存储ZODB,而不是使用标准FileStorage;这个后端使用传统的关系数据库来代替提供并发访问。

有关这两个选项的一些使用示例,请参阅zc.lockfile.LockError in ZODB

ZODB数据结构只是持久化的Python数据结构;合并三个ZODB数据结构需要您打开每个数据库并根据需要合并嵌套结构。

答案 1 :(得分:0)

好的,由于ZODB对象数据库本质上只是python对象的字典,this post恰好是我正在寻找的答案。它讨论了如何将数据库添加到一起,并且这样做可以将两个数据库中任何类似的公共密钥相加。它仍然是我正在寻找的答案,因为两个数据库是互斥的,因此结果将是一个ZODB数据库,其中包含其他两个未修改的条目。