繁体   English   中英

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

[英]Quickest and most efficient way to search large sorted text file

我有一个大型静态文本/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')] ,它表示第一个完全匹配的“阿尔法”和“伽马”。

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

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

  2. 将文件读入一次列表,并使用二分查找(例如bisect )。 与 1.) 类似的问题,对于每个需要进行搜索的用户,该文件将被加载到内存中。

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

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

我真的很乐于接受各种想法,而且我绝不局限于上述四个选项!

谢谢 :)

类似于方法#2 的东西怎么样。 您仍然可以将文件读入内存,但不是将其存储到列表中并使用二进制搜索来搜索键,而是可以将文件存储到哈希映射中

这样做的好处是利用哈希映射的平均查找时间O(1)O(n)的最坏情况。 时间复杂度的好处和理由可以在这里这里找到。 由于您只查找键,因此具有恒定的查找时间将是搜索文件的好方法。 这种方法也比二分搜索的平均O(log n)搜索时间快。

您可以将文件存储为

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

请注意,此方法仅适用于您的所有键都不同且没有重复键的情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM