我正在使用ZODB和ZEO,并在其中存储一个Btree(),其中包含大约2500万个对象,这些对象的键是不同长度的文本字符串。为了以“安全且可预测的方式”迭代对象,我遵循BTrees documentation的建议并首先复制密钥列表,如此(其中db
是BTree对象):
for key in list(db.keys()):
...do stuff...
但是,创建该密钥列表需要相当长的时间,即使是最近的多核服务器级系统,具有48 GB的RAM(运行CentOS 7,裸机,不在VM中)。如果我单独计算list(db.keys())
所需的时间,则需要9-10分钟。就大小而言,sys.getsizeof(list(db.keys()))
报告220 MB,这与2500万字符串列表的预期大小一致,其长度从2-70个字符(大约)变化。
是否有更快的方法将密钥复制到列表中,或者,有更好的方法以安全的方式迭代BTree元素,以防其他进程向BTree添加对象?
我曾尝试在Python中研究更快的复制方法,但我发现它一直专注于复制列表或词典(例如,过去的SO问题here和here),而不是“listifying” “来自BTree的钥匙。