このドキュメントでは、リストを再割り当てすることで、「可変属性を不変であるかのように使用する」という 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()
#......