![](/img/trans.png)
[英]What is the most efficient way to repeatedly search a large text file (800 MB) for certain numbers?
[英]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')]
,它表示第一个完全匹配的“阿尔法”和“伽马”。
我一直在阅读有关我拥有的选项的信息,我真的很喜欢您对以下哪种方法最适合我的用例的意见。
将文件一次读入有序集合,并执行 200 次左右的查找。 但是,对于每个使用该应用程序的用户(~100),该文件将被加载到内存中。
将文件读入一次列表,并使用二分查找(例如bisect )。 与 1.) 类似的问题,对于每个需要进行搜索的用户,该文件将被加载到内存中。
不要将整个文件读入内存,而只是一次读取文件一行。 我可以按每个字母 (a.csv, b.csv, ...) 将 .csv 分成 26 个文件,以加快速度。
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.