3

Python で 2 つの非常に大きなファイル (それぞれが 1.000.000 エントリを超える) に問題があります: フィルターを生成する必要がありますが、理由がわかりません。次のような 2 つのファイルがあります。

1,2,3
2,4,5
3,3,4

そして2番目

1,"fege"
2,"greger"
4,"feffg"

各ファイル行の最初の項目は常に ID です。最初のリストには、2 番目のファイルにある ID のアイテムのみが含まれるように、リストをフィルター処理したいと思います。この例では、結果は次のようになります。

1,2,3
2,4,5

これを非常に高速な方法で作成する方法は?中心的な問題は、各リストが非常に長いことです。私はsthを使用しました。このような:

[row for row in myRows if row[0] == item[0]]

しかし、これはスローを実行するのに長い時間がかかります。(30日以上)

4

2 に答える 2

7
[row for row in myRows if row[0] == item[0]]

は、それぞれに対して線形スキャンを実行していますitem。代わりにa を使用するsetと、予想される一定時間の操作にこれを下げることができます。まず、2 番目のファイルを読み込んで、set有効な IDを取得します。

with open("secondfile") as f:
    # note: only storing the ids, not the whole line
    valid_ids = set(ln.split(',', 1)[0] for ln in f)

valid_ids次に、セットを次のように使用して、最初のファイルの行をフィルタリングできます。

with open("firstfile") as f:
    matched_rows = [ln for ln in f if ln.split(',')[0] in valid_ids]
于 2013-05-20T14:13:00.583 に答える
1

I assume you are only interested in the first field. If so, you could try something like:

def _id(s):
  return s[:s.index(',')]

ids = {}
for line in open('first-file'):
 ids[_id(line)] = line
for line in open('second-file'):
 k = _id(line)
 if k in ids:
  print ids[k]
于 2013-05-20T14:18:36.043 に答える