1

我正在编写一个检索网页的软件,将有关它们的一些关键信息提取到一个对象中,然后将其写入 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 是用于添加的单个对象还是整个数据库。这些对象中的每一个都应该很小,但是消息会显示在每个添加的新对象上。

4

1 回答 1

5

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

BTree在文档中查找ZODB 支持的各种风格。这些是可扩展的、持久的键值映射,几乎可以肯定你应该使用它来完成这项任务。

请注意,ZODB 实现了几种BTree提高效率的方式。最通用的是OOBTree,它允许键和值的通用对象。最具体的是IIBTree,它只允许 32 位整数作为键和值。这是一个教程:

http://pythonhosted.org/BTrees

于 2013-09-14T05:06:50.250 回答