2011-03-27 44 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需要處理,您可以多次讀取這些文件。

但是沒有真正的魔力子彈。