ZODB Bloat一定是坏事吗?

时间:2013-09-14 00:30:50

标签: python database zodb

我正在编写一个检索网页的软件,将一些关键信息提取到一个对象中,然后将其写入ZODB数据库。我最终将大约350,000个这些对象写入我的数据库。

我的代码运行一段时间后,每当我向数据库添加一个新对象时它就会开始发布此消息...

UserWarning: The <class 'persistent.mapping.PersistentMapping'>
object you're saving is large. (26362014 bytes.)
Perhaps you're storing media which should be stored in blobs.

Perhaps you're using a non-scalable data structure, such as a
PersistentMapping or PersistentList.

Perhaps you're storing data in objects that aren't persistent at
all. In cases like that, the data is stored in the record of the
containing persistent object.

In any case, storing records this big is probably a bad idea.

所以我的问题首先是,错误消息所指的26MB是针对要添加的单个对象还是整个数据库。这些对象中的每一个都应该非常小,但是每个新对象都会显示消息。

1 个答案:

答案 0 :(得分:4)

26MB是为整个PersistentMapping对象生成的“pickle”的大小。正如消息所说,PersistentMapping不可扩展:如果你再添加一个键值对,并提交事务,它会写出26MB(加上你添加的单个新对的大小)的再次即可。每次更改PersistentMapping实例并提交时,整个对象都会存储到磁盘(包括之前添加的所有对象)。通过一系列的添加和提交,这会在您添加的项目数中产生总数据库大小二次,并且还会受到二次时间行为的影响(您添加的每个新项目都需要比上一项更长的时间添加,因为每个提交也写出所有以前添加的项目,而不仅仅是最后添加的项目。)

在文档中查看BTree ZODB支持的各种风格。这些是可伸缩的,持久的键值映射,几乎可以肯定你应该用于此任务。

请注意,ZODB实现了几种BTree的效率。最常见的是OOBTree,它允许键和值的一般对象。最具体的是IIBTree,它只允许32位整数用于键和值。这是一个教程:

http://pythonhosted.org/BTrees