2016-04-20 23 views
2

私は2つの列があり、非常に大きなファイルを持っている〜10ギガバイトのためのマップを構築する次のようにサイズで大規模なデータセット

A B 
1 2 
3 7 
1 5 
6 5 
9 8 

は基本的に、私はこのファイルから構造のようなマップを作成したい:

{{1 -> 2,5},{3->7}, {6->5}, {9->8}} 

目的は、キーを削除することによって影響を受ける一意の値の割合を計算する関数を作成することです。たとえば、上記の例では、キーを削除すると値の1,2/4が影響を受けます。 1と6の両方を削除すると、値の2/4が影響を受けます。問題は、このマップ構造が多すぎるメモリを使用することです。より効率的な代替アプローチがありますか?重複を追跡するためにマップが必要だと私は思います。二重カウントしないように、どのキーがすでに削除されているかを知る必要があります。ここに私の最初のコードは次のとおりです。

with open("C:/Users/XX/Desktop/Train.tsv") as f: 
    counter = 0 
    for line in f: 
     #split line into key and value 
     #add key into set 
     #if set does not contain key 
     #create new key 
     #add list for this key 
     #append value to this list 
     #else 
     #append value to already existing list for that key 

これは私がアレキサンダーのコードを実行した後に取得するエラーメッセージです:あなたは私たちがに設定される、このためdefaultdictを使用することができますKeyError例外293が

--------------------------------------------------------------------------- 
KeyError         Traceback (most recent call last) 
<ipython-input-22-73145e080824> in <module>() 
     7  for line in f: 
     8   key, value = line.split() 
----> 9   if value not in dd[key]: 
    10    dd[key].append(value) 
    11   counter = counter+1 

KeyError: '293' 
+0

1つのキーに多くの値が表示されると思いますか?あなたは値が何であるかを正確に調べるのではなく、どれくらいのものがあるかを追跡するだけで、いくらかの記憶を節約することができます。 – user2357112

+0

2つの列の実際の範囲は何ですか?それらは整数であることが保証されていますか?小さな整数?キャラクター? –

+0

両方の型は整数でなければなりません。また、正確な値がわからず、各キーの頻度だけを知っていれば、異なるキーが同じ値を持つ可能性があるため、カバレッジを得るのは難しいでしょう。 – zorny

答えて

2

このようなものはありますか?

#!python3 

from collections import defaultdict 

AB_map = defaultdict(set) 
Values = set() 

with open('train.tsv') as infile: 
    headers = next(infile) 
    for line in infile: 
     if not line.strip(): 
      continue 
     a,b = map(int, line.split()) 
     AB_map[a].add(b) 
     Values.add(b) 

print("# of keys:", len(AB_map.keys())) 
print("# of values:", len(Values)) 

def impact_of_deletion(keylist): 
    values_impacted = set([]) 
    for key in keylist: 
     values_impacted.update(AB_map[key]) 
    return values_impacted 

for hyp in ((1,), (1,6)): 
    print("Deleting", hyp, "would impact:", len(impact_of_deletion(hyp))) 
1

を何を意味するのかわかりません各キーに空のリストを自動的に割り当てます。

from collections import defaultdict 

filename = "C:/Users/XX/Desktop/Train.tsv" 
dd = defaultdict(list) 
with open(filename) as f: 
    for line in f: 
     key, value = line.split(',') # Assuming comma delimited. 
     if value not in dd[key]: # If you only want to retain unique values. 
      dd[key].append(value) 
+0

これは本当にメモリの問題では役に立ちません。 – user2357112

+0

する必要があります。まず、一括ではなく行単位でファイルを読み込みます。次に、すべてのキーではなく、キーごとに固有の値を保存しています。結果をデータベースやファイルに保存せずに実行できるその他のことはあまりありません。 – Alexander

+0

@Alexander @zorny私はそれがむしろ 'dd = defaultdict(list)'であるべきだと思います。私はこれが 'KeyError'問題を解決すると思います。 – ptrj

関連する問題