私は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'
1つのキーに多くの値が表示されると思いますか?あなたは値が何であるかを正確に調べるのではなく、どれくらいのものがあるかを追跡するだけで、いくらかの記憶を節約することができます。 – user2357112
2つの列の実際の範囲は何ですか?それらは整数であることが保証されていますか?小さな整数?キャラクター? –
両方の型は整数でなければなりません。また、正確な値がわからず、各キーの頻度だけを知っていれば、異なるキーが同じ値を持つ可能性があるため、カバレッジを得るのは難しいでしょう。 – zorny