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

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

我有一个大的静态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中创建一个可重用的索引来支持这些类型的查找?

我对这些想法非常开放,我绝不限于上述四种选择!

谢谢 :)

python list search set whoosh
1个回答
1
投票

类似于方法#2的事情怎么样?您仍然可以将文件读入内存,但不是将其存储到列表中,而是使用二进制搜索来搜索键,您可以将文件存储到hash map中。

这样做的好处是利用哈希映射的O(1)的平均查找时间与O(n)的最坏情况。时间复杂性的好处和理由可以找到herehere。由于您只是查找键,因此查找持续查找时间将是搜索文件的好方法。这种方法也比二进制搜索的平均O(log n)搜索时间更快。

您可以将文件存储为

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

请注意,只有当您的密钥都是不同的且没有重复密钥时,此方法才可行。

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