2011-03-27 43 views
1

我遍历一个非常大的制表符分隔的文件(包含数百万行)并根据该文件中某些字段的值配对它的不同行,例如从内存有效的方式从字典中创建Python中的迭代器

mydict = defaultdict() 
for line in myfile: 
    # Group all lines that have the same field into a list 
    mydict[line.field].append(line) 

由于“mydict”变得非常大,我想将它做成一个迭代器,所以我没有持有这一切在内存中。我如何做到这一点,而不是填充字典,我会创建一个迭代器,我可以循环并获得所有这些具有相同字段值的行的列表?

谢谢。

+0

您必须展示mydict是如何使用的,否则不可能告诉 – tokland 2011-03-27 18:39:48

+1

有多少百万行?平均线长? 'field'的本质是什么?你说“配对”......“对”意味着2;期望得到的列表的最小值,最大值和平均值是多少?你打算如何处理结果...找到重复的记录? – 2011-03-27 21:10:43

回答

1

除非线条很长,否则“数百万行”不是很大。如果行很长,则可以通过仅存储文件中的位置来节省一些内存(.tell()/.seek())。

如果该文件按line.field排序;你可以使用itertools.groupby()

SQL的GROUP BY可能有助于平均大小的文件(例如,使用sqlite作为@wisty suggested)。

对于非常大的文件,您可以使用MapReduce

2

这听起来像你可能想要一个数据库。有很多关系数据库和非关系数据库可以选择(一些比其他的更有效,这取决于你想实现的目标),但是sqlite(内置于python)会是最简单的。

或者,如果只有少量的line.fields需要处理,您可以多次读取这些文件。

但是没有真正的魔力子弹。