0

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

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

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

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

... 

其中省略号表示更多相同。对于数据库中的每个“IDXXXXXX”键,键“property1”、“property2”等的名称都是相同的,尽管值肯定会有所不同。

2) 并行运行此代码同时仍然产生单个 ZODB 结构会更聪明吗?

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

谢谢!

4

2 回答 2

1

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

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

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

有关任一选项的一些用法示例,请参见ZODB 中的 zc.lockfile.LockError 。

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

于 2013-08-19T20:13:42.920 回答
0

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

于 2013-11-08T20:42:51.643 回答