python嗖嗖地索引一个大文件需要太长时间

问题描述 投票:0回答:1

我有一个包含约900万行的CSV文件。我希望能够快速搜索此文件中的一行。我决定使用python whoosh来索引这些数据,然后搜索它,如下所示。

schema = Schema(content=TEXT(stored=True, analyzer=RegexTokenizer() | LowercaseFilter() | CharsetFilter(accent_map)))

if not os.path.exists("index"):
    os.mkdir("index")
ix = create_in("index", schema)

ix = open_dir("index")

writer = ix.writer()

with open(file_path, 'r', encoding='utf-8') as file:
    for line in file:
        writer.add_document(content=line)

writer.commit()

我不确定这是否是索引数据的正确/最快方法。更改架构会使索引更快吗?如果没有,那么在这样的大文件大小上使用whoosh或其他索引库的一般想法是不是很好?

好处是索引只会进行一次,所以我愿意等待,这样可以提供快速的搜索时间。我没有全文检索的经验。有人会知道,根据我的设置,索引需要多长时间?

这是我的csv示例:

ID,TYPE,TEXT,ID2
1058895,1,Be,1067806
1058895,2,Hosl,101938
1058895,3,370,None
1058895,4,Tnwg,10582
python csv indexing full-text-search whoosh
1个回答
1
投票

你的方法很好。通过全文搜索进行权衡,您可以快速查询慢速索引,因此您可以尽可能地提前完成工作。

与Lucene及其生态系统(Solr,Elasticsearch)相比,Whoosh索引非常缓慢。从我在PC上的一些快速测试中,它的索引大约为每秒540行。您可以预计在大约4.5到5小时内会有900万行索引。您添加的字段越多,特别是要分析的字段,所需的时间越长,因此请确保仅分析必要的字段并仅索引所需的字段。

如果您计划多次查询此索引,那么投资时间可能是值得的,您的查询应该相当快。如果您需要经常索引大型文件并且无法每次等待5个小时,那么请考虑切换到Lucene,Solr或Elasticsearch。

您的数据似乎也很简单。如果精确的布尔查询就足够了,Pandas查询允许您更快地搜索DataFrame。 Pandas为基本文本处理提供快速矢量化方法,您可以将其用于小写,删除停用词,字符映射和正则表达式等内容。

如果您需要评分和NLP设施,例如词干和断字,您只需要全文搜索。

© www.soinside.com 2019 - 2024. All rights reserved.