假设我们有一个包含员工姓名和年龄列的csv文件(> 5GB)。该文件按年龄排序。 现在,我希望用户使用Age搜索此文件。有人可以指导我哪种数据结构最适合这个要求吗?
示例:
myfile.csv
25 ABC
25 MNP
14 XYZ
14 PQR
输入:
14
输出:
XYZ
PQR
答案 0 :(得分:4)
假设文件太大而无法容纳在RAM中,您可以创建索引,这样就可以最大限度地减少磁盘读取次数(这比RAM读取速度慢得多)。
一些常用的磁盘索引是B+ trees(顶层存储在RAM中)和hash tables。
或者,您可以将其存储为SQL表,让图书馆自行处理。
另一种选择,因为范围相当小(我无法想象年龄大于200),您可以使用200(或可能更少)不同的文件:names_1,names_2,...,names_200
其中names_i
包含一个列表年龄为i
的所有姓名。
(另外,由于年龄大多以这种方式省略,你可能真的可以将它作为dictionary:age->list<names>
)放在RAM中
如果数据适合RAM - 您可以使用排序数组(如果数据中的更改不经常/不期望)并使用二进制搜索。
如果需要对数据进行更改,可以使用其他一些结构,例如RAM上的哈希表或self balancing BST
答案 1 :(得分:1)
您尚未表明您的基础架构是否允许内存解决方案。如果是这样,看到你用python标记了你的问题,我会把文件的内容读成defaultdict。如果性能可以接受,那么您可以使用基于库的快速标准解决方案
>>> from collections import defaultdict
>>> z = defaultdict(list)
>>> z[25].append("ABC")
>>> z[25].append("MNP")
>>> print z[25]
['ABC', 'MNP']