以下是我尝试使用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会错过提交?
答案 0 :(得分:0)
对于光标迭代器没有给出1024个项目的精确倍数的情况,代码看起来有点问题。
最后,你将拥有&lt;然后,作业列表中的1024个项目将离开for循环。你在for循环之后处理这个余数吗?
除此之外:你使用的是哪种嗖的版本?
您是否尝试过最新的2.4x分支和来自回购的默认分支代码?