2

这是我尝试使用 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 会错过提交?

4

1 回答 1

1

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

最后,您的工作列表中将有 < 1024 个项目,然后它将离开 for 循环。你在for循环之后处理这个余数吗?

除此之外:您使用的是哪个版本?

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

于 2013-04-11T22:41:46.733 回答