2013-04-07 22 views
0

下面是例子中,我尝试为大集合与最终嗖Python的嗖的BufferedWriter不提交到磁盘

schema = Schema(name=TEXT(stored=True), m=ID(stored=True), content=KEYWORD(stored=True)) 
ix = create_in("indexdir", schema) 
from whoosh.writing import BufferedWriter 
from multiprocessing import Pool 
jobs = [] 

writer = BufferedWriter(ix, period=15, limit=512, writerargs = {"limitmb": 512}) 
for item in cursor: 
    if len(jobs) < 1024: 
     jobs.append(item) 
    else: 
     p = Pool(8) 
     p.map(create_barrel, jobs) 
     p.close() 
     p.join() 
     jobs = [] 
     writer.commit() 

create_barrel功能执行以下操作:

writer.add_document(name = name, m = item['_id'], content = " ".join(some_processed_data)) 

还在运行几个小时后,索引是空的,并且indexdir中唯一的文件是锁定文件_MAIN_0.toc

上面的代码适用于切换无AsyncWriter但s ome的原因AsyncWriter错过了大约90%的提交和标准作家对我来说太慢了。

为什么BufferedWriter未能提交?

回答

0

对于游标迭代器未提供1024个项目的精确倍数的情况,代码看起来有点问题。

最后,您将在作业列表中有<个1024项,然后它将离开for-loop。你是否在for循环之后处理这个余数?

除此之外:您正在使用哪个whoosh版本?

您是否尝试过最新的2.4x分支和默认分支代码?

+0

我只试过2.4.1。它由pip安装。我应该尝试哪个其他分支?另外,你对代码中的其他问题还是正确的,但我拥有3.5百万个项目,并不在意它们中的一些是否会丢失。 – Moonwalker 2013-04-12 10:32:30