我有一个很大的静态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”的第一个完全匹配。
我一直在阅读有关我拥有的选项的信息,我真的很喜欢您对以下哪种方法最适合我的用例的意见。
将文件读入有序集合一次,然后执行200次左右的查找。但是,对于使用该应用程序的每个用户(〜100),该文件将被加载到内存中。
将文件读入列表一次,然后使用二进制搜索(例如bisect)。与1.类似的问题。)文件将为每个需要搜索的用户加载到内存中。
不将整个文件读入内存,而一次只读取一行。我可以按每个字母(a.csv,b.csv,...)将.csv分成26个文件,以加快速度。
Whoosh是一个搜索库,因为它一次创建了一个索引,因此引起了我的注意。但是,我不确定它是否完全适用于我的用例,因为它看起来像是全文搜索,并且我不能只限于查找第一列。如果无法使用此特定库,是否还有其他方法可以在Python中创建可重用索引以支持此类查找?
我真的很愿意接受想法,而且我绝不限于以上四个选项!
谢谢:)
答案 0 :(得分:1)
与方法2类似的情况如何。您仍然可以将文件读取到内存中,但是可以将文件存储到hash map中,而不是将其存储到列表中并使用二进制搜索来搜索关键字。
这样做的好处是利用哈希图的平均查找时间O(1)
,最坏的情况是O(n)
。时间复杂度的好处和合理性可以在here和here中找到。由于您只查找键,因此具有恒定的查找时间将是搜索文件的好方法。此方法还将比二进制搜索的平均O(log n)
搜索时间更快。
您可以将文件存储为
table = {
key1: (value1, value2),
key2: (value1, value2),
key2: (value1, value2)
}
请注意,只有当您的键完全不同且没有重复的键时,此方法才可行。