在本文档中,介绍了 ZODB 中处理可变列表的方法,即通过重新分配列表来“使用可变属性,就好像它是不可变的一样”。我试图在 OOBTree 结构中创建一个简单但相当长的倒排索引,其中的值是列表。受上述方法的启发,没有使用 Persistentlist 或任何其他东西,我只是将“追加”替换为重新分配列表,它工作得很好,并且生成的数据库文件非常小。我检查了一下,显然索引没有任何问题,但我无法确定。真的可以这么简单吗?任何建议将不胜感激。
以下是我为使用 ZODB 创建倒排索引而编写的一些代码片段:
#......
root['idx']=OOBTree()
myindex = root['idx']
i=0
#.....
doc = cursor.first()
while doc:
docdict = {}
for word in doc.words():
docdict[word]=docdict.setdefault(word,0)+1
for (word,freq) in docdict.iteritems():
i+=1
if word in myindex:
myindex[word]= myindex[word]+ [(doc[0],freq)]
# This seems to work just fine.
# This is where I'm confused. Can this really work all right?
else:
myindex[word]=[(doc[0],freq)] # This list is not a PersistentList.
if i % 200000 == 0: transaction.savepoint(True)
doc =cursor.next()
docs.close()
transaction.commit()
#......