用于存储巨大(> 5GB)排序文件的数据结构

时间:2012-10-13 17:31:20

标签: python algorithm

假设我们有一个包含员工姓名和年龄列的csv文件(> 5GB)。该文件按年龄排序。 现在,我希望用户使用Age搜索此文件。有人可以指导我哪种数据结构最适合这个要求吗?

示例

myfile.csv

25 ABC    
25 MNP
14 XYZ
14 PQR

输入

14

输出

XYZ
PQR

2 个答案:

答案 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']