搜索大型排序文本文件的最快,最高效的方法

时间:2019-04-03 00:07:12

标签: python list search set whoosh

我有一个很大的静态text / csv文件,其中包含约10万行(2MB)。它本质上是一本字典,我需要在Python中对此数据进行常规查找。

文件格式为:

    key         value1       value2     
    alpha       x1           x2
    alpha beta  y1           y2
    gamma       z1           z2  
    ...
  • 键可以是多字字符串。
  • 列表按字母顺序按字母顺序排序
  • 值是字符串

这是Web应用程序的一部分,每个用户将一次查找100-300个键,并且期望每个键都获得值1和值2。该应用程序上将有多达100个用户,每个用户在同一数据上查找这些100-300个键。

我只需要返回第一个完全匹配项。例如,如果用户搜索了键[alpha, gamma],我只需要返回[('x1','x2'), ('z1','z2')],它代表“ alpha”和“ gamma”的第一个完全匹配。

我一直在阅读有关我拥有的选项的信息,我真的很喜欢您对以下哪种方法最适合我的用例的意见。

  1. 将文件读入有序集合一次,然后执行200次左右的查找。但是,对于使用该应用程序的每个用户(〜100),该文件将被加载到内存中。

  2. 将文件读入列表一次,然后使用二进制搜索(例如bisect)。与1.类似的问题。)文件将为每个需要搜索的用户加载到内存中。

  3. 不将整个文件读入内存,而一次只读取一行。我可以按每个字母(a.csv,b.csv,...)将.csv分成26个文件,以加快速度。

  4. Whoosh是一个搜索库,因为它一次创建了一个索引,因此引起了我的注意。但是,我不确定它是否完全适用于我的用例,因为它看起来像是全文搜索,并且我不能只限于查找第一列。如果无法使用此特定库,是否还有其他方法可以在Python中创建可重用索引以支持此类查找?

我真的很愿意接受想法,而且我绝不限于以上四个选项!

谢谢:)

1 个答案:

答案 0 :(得分:1)

与方法2类似的情况如何。您仍然可以将文件读取到内存中,但是可以将文件存储到hash map中,而不是将其存储到列表中并使用二进制搜索来搜索关键字。

这样做的好处是利用哈希图的平均查找时间O(1),最坏的情况是O(n)。时间复杂度的好处和合理性可以在herehere中找到。由于您只查找键,因此具有恒定的查找时间将是搜索文件的好方法。此方法还将比二进制搜索的平均O(log n)搜索时间更快。

您可以将文件存储为

table = {
    key1: (value1, value2),
    key2: (value1, value2),
    key2: (value1, value2)
}

请注意,只有当您的键完全不同且没有重复的键时,此方法才可行。