ZODB膨胀一定是件坏事吗?

2024-10-05 10:22:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个软件,它可以检索网页,将有关网页的一些关键信息提取到一个对象中,然后将这些信息写入ZODB数据库。我最终大约有35万个这样的对象被写入我的数据库。在

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

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是针对要添加的单个对象或整个数据库的。这些对象中的每一个都应该很小,但是在每个新添加的对象上都会显示消息。在


Tags: the对象inreyou数据库消息网页
1条回答
网友
1楼 · 发布于 2024-10-05 10:22:09

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

在文档中查找BTreeZODB支持的各种风格。这些是可伸缩的、持久的键值映射,几乎可以肯定您应该将其用于此任务。在

注意,为了提高效率,ZODB实现了几种风格的BTree。最通用的是OOBTree,它允许键和值的通用对象。最具体的是IIBTree,它只允许密钥和值的32位整数。下面是一个教程:

http://pythonhosted.org/BTrees

相关问题 更多 >

    热门问题