我必須搜索科學期刊文章的大表,以獲取某些特定文章,這些文章包含在單獨的文件中。我的方法是使用Whoosh從大表中構建搜索索引,然後搜索索引中分隔文件的每篇文章。這很好,但需要很長時間(〜2周)。所以我想通過實現多處理來加快速度,這就是我正在掙扎的地方。在內存中沒有複製索引的多處理搜索
沒有多我的「簡單」搜索的重要組成部分如下所示:
articles = open('AuthorArticles.txt', 'r', encoding='utf-8').read().splitlines()
fs = FileStorage(dir_index, supports_mmap=False)
ix = fs.open_index()
with ix.searcher() as srch:
for article in articles:
# do stuff with article
q = QueryParser('full_text', ix.schema).parse(article)
res = srch.search(q, limit=None)
if not res.is_empty():
with open(output_file, 'a', encoding='utf-8') as target:
for r in res:
target.write(r['full_text'])
現在,我特別希望實現的是,該指數被加載到內存中,然後多個進程訪問和搜索爲文章。我嘗試到目前爲止是這樣的:
articles = open('AuthorArticles.txt', 'r', encoding='utf-8').read().splitlines()
def search_index(article):
fs = FileStorage(dir_index, supports_mmap=True)
ix = fs.open_index()
with ix.searcher() as srch:
result = []
for a in article
# do stuff with article
q = QueryParser('full_text', ix.schema).parse(q)
res = srch.search(q, limit=None)
if not res.is_empty():
for r in res:
result.extend[r['full_text']]
return result
if __name__ == '__main__':
with Pool(4) as p:
results = p.map(search_index, articles, chunksize=100)
print(results)
但是,據我瞭解,這樣每個單獨進程加載索引內存(這是行不通的,因爲該指數是相當大的)。
有沒有什麼辦法可以以相對簡單的方式實現我所需要的?基本上我想要做的就是使用手頭的整個計算能力來搜索索引。
你可以給一個'AuthorArticles.txt'的簡短樣本,所以我做測試嗎? –