统计ZODB中保存的B树的length()需要多少时间
Counting len() of BTree saved in ZODB takes much time
我使用 ZODB 结合 BTree
s 来存储大量数据(数百万个键)。我想在我的根字典中获取确切的条目数(BTree
)。正如我所注意到的,len()
调用 .keys()
的结果需要很长时间(至少几十分钟,老实说,当数据集变大时,我从来没有等到它结束)。
import ZODB
from BTrees.OOBTree import BTree
connection = ZODB.connection('database.fs')
dbroot = connection.root()
if not hasattr(dbroot, 'dictionary'):
dbroot.dictionary = BTree()
# much data is added and transactions are commited
number_of_items = len(dbroot.dictionary.keys()) # takes very long time
我定期打包数据库。
我认为它与问题无关,但 dbroot.dictionary
包含其他 BTree
作为值。
您正在调用 .keys()
方法,该方法必须加载并生成所有键的完整列表。 那个需要很多时间。
你可以问BTree的长度本身:
number_of_items = len(dbroot.dictionary)
这仍然需要load all the buckets themselves(键块)来询问每个键的长度,所以这仍然需要加载大量数据,只是不产生列表。
我们一直避免尝试获得直接长度; Btree.Length
object 更适合跟踪长度 'manually'。该对象完全是 ZODB conflict-resolving。每次向 dbroot.dictionary
添加元素时,向 BTree.Length
对象添加一个计数并让它保持计数:
from BTrees.OOBTree import BTree
from BTrees.Length import Length
if not hasattr(dbroot, 'dictionary'):
dbroot.dictionary = BTree()
dbroot.dict_length = Length()
# add objects into the dictionary? Add to the length as well:
for i in range(count):
dbroot.dictionary[keys[i]] = value[i]
dbroot.dict_length.change(count)
然后调用对象读出长度:
length = dbroot.dict_length()
我使用 ZODB 结合 BTree
s 来存储大量数据(数百万个键)。我想在我的根字典中获取确切的条目数(BTree
)。正如我所注意到的,len()
调用 .keys()
的结果需要很长时间(至少几十分钟,老实说,当数据集变大时,我从来没有等到它结束)。
import ZODB
from BTrees.OOBTree import BTree
connection = ZODB.connection('database.fs')
dbroot = connection.root()
if not hasattr(dbroot, 'dictionary'):
dbroot.dictionary = BTree()
# much data is added and transactions are commited
number_of_items = len(dbroot.dictionary.keys()) # takes very long time
我定期打包数据库。
我认为它与问题无关,但 dbroot.dictionary
包含其他 BTree
作为值。
您正在调用 .keys()
方法,该方法必须加载并生成所有键的完整列表。 那个需要很多时间。
你可以问BTree的长度本身:
number_of_items = len(dbroot.dictionary)
这仍然需要load all the buckets themselves(键块)来询问每个键的长度,所以这仍然需要加载大量数据,只是不产生列表。
我们一直避免尝试获得直接长度; Btree.Length
object 更适合跟踪长度 'manually'。该对象完全是 ZODB conflict-resolving。每次向 dbroot.dictionary
添加元素时,向 BTree.Length
对象添加一个计数并让它保持计数:
from BTrees.OOBTree import BTree
from BTrees.Length import Length
if not hasattr(dbroot, 'dictionary'):
dbroot.dictionary = BTree()
dbroot.dict_length = Length()
# add objects into the dictionary? Add to the length as well:
for i in range(count):
dbroot.dictionary[keys[i]] = value[i]
dbroot.dict_length.change(count)
然后调用对象读出长度:
length = dbroot.dict_length()