1

非常に大きなタブ区切りファイル(数百万行を含む)を繰り返し処理し、そのファイル内のフィールドの値に基づいて、そのファイルのさまざまな行をペアリングしています。

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

「mydict」は非常に大きくなるので、イテレータにしたいので、すべてをメモリに保持する必要はありません。ディクショナリにデータを入力する代わりに、ループして同じフィールド値を持つ行のリストをすべて取得できるイテレータを作成するにはどうすればよいですか?

ありがとう。

4

2 に答える 2

2

データベースが必要なようです。さまざまなリレーショナルデータベースと非リレーショナルデータベースから選択できますが(達成しようとしていることに応じて、他のデータベースよりも効率的なものもあります)、sqlite(Pythonに組み込まれている)が最も簡単です。

または、処理するline.fieldの数が少ない場合は、ファイルを数回読み取ることができます。

しかし、本当の魔法の弾丸はありません。

于 2011-03-27T18:12:45.567 に答える
1

「数百万の線」は、線が長くない限り、それほど大きくはありません。行が長い場合は、ファイル内の位置のみを保存することでメモリを節約できます(.tell()/ .seek())。

ファイルがline.field;でソートされている場合 itertools.groupby()を使用できます。

SQLGROUP BYは、平均的なサイズのファイルに役立つ場合があります(たとえば、@ wistyが提案sqliteしたように使用します)。

非常に大きなファイルの場合は、MapReduceを使用できます。

于 2011-03-27T18:25:16.487 に答える