-3

PythonでのHadoopストリーミングジョブでメモリの問題で困っています。プログラムでは、次のような構造体が必要です。

dict{"metric_id":set(user_id1,user_id2...),...} 

reduce (reducer のみ) では、metric_id ごとに何人のユーザーがいるかを計算します。現在、約 1 億人のユーザーがおり、約 6G のメモリを消費します。

モジュールshelveを試してみましたが、非常に遅いです...間違った方法で使用した可能性があります:

tmp_set = set()
for id in value.split(","):
    if id != "":
        tmp_set.add(id) 
if self.ids_dict.has_key(metric_id):
    ori_set = self.ids_dict[metric_id]
    self.ids_dict[metric_id] = ori_set.union(tmp_set)
else:
    self.ids_dict[metric_id] = tmp_set
4

1 に答える 1

1

これは単に良い考えではありません。100,000,000 人のユーザーすべてを一度にロードする必要があると想像できる理由はありません。

メトリクス ID によるユーザー数へのアクセスが本当に必要な場合は、その数のどこかに別の辞書またはテーブルを維持する必要があります

{'<metric id 1>': 3,
 '<metric id 2>': 5,
 ...
}

この情報はすでにそのまま保存されているため、プログラムを 1 回実行して (非常に遅くなります)、この情報を収集することができます。

import collections
numbers = collections.defaultdict(int)
for id, users in mydict.iteritems():
    numbers[id] += len(users)

そして、アイテムを追加/削除するたびにそのデータ構造を更新して、この値が事前に計算されるようにします。約 1 億の長さのオブジェクトの長さを定期的に決定する効率的な方法はありません。

于 2012-12-19T12:58:16.267 に答える