这是我尝试使用 whoosh 索引大型集合的示例
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 时,上面的代码可以工作,但由于某种原因,AsyncWriter 错过了大约 90% 的提交,并且标准编写器对我来说太慢了。
为什么 BufferedWriter 会错过提交?