2

巨大なデータにpython dictを使用するとパフォーマンスが低下するため、なんとかredisに移行しました。だから私は次のものを持っています:

"doc1" =>  ('989', 4.0), ('99', 4.0), ('990', 4.0), ('991', 4.0), ('992', 4.0), ('993', 4.0), ('994', 4.0), ('995', 4.0), ('996', 4.0), ('997', 4.0), ('998', 4.0), ('999', 4.0)

"doc2" =>  ('4', 4.0), ('21', 4.0), ('55', 4.0), ('991', 4.0), ('992', 4.0), ('993', 4.0), ('994', 4.0), ('995', 4.0), ('996', 4.0)

"result" => ('991', 8.0), ('992', 8.0), ('993', 8.0), ('994', 8.0), ('995', 8.0), ('996', 8.0), ('99', 4.0),('4', 4.0), ('21', 4.0), ('55', 4.0)

ご覧のとおり、doc2 に存在する doc1 に要素がある場合はその値を合計し、doc1 の要素が doc2 に存在しない場合は、python を使用して 2 つの redis リストを 1 つに結合したいと考えています。要素から結果へ。dict を使用した以前の実装は次のとおりです。

result_array = {k: [db_array.get(k, result_array.get(k))[0],db_array.get(k, dv)[1] + result_array.get(k, dv)[1]] for k in set(db_array) | set(result_array)}

辞書の構造を維持する方法

ご覧のとおり、このソリューションは次の目的で使用されます。

{'991': [4.0, 's.text'], '21': [4.0, 't.text'], '990': [4.0, 'b.text']}

しかし、redis は list in list をサポートしていないため、別の解決策を見つける必要があります。

4

1 に答える 1

2

値が一意である場合は、redisで並べ替えられたセットを使用できます。

zadd doc1 4.0 989
zadd doc1 4.0 991

zadd doc2 4.0 21
zadd doc2 4.0 991

zinterstore result 2 doc1 doc2
zrange result 0 -1 withscores
1) "991"
2) "8"

これにより、セット(両方のセットに存在する要素)と各セットの要素のスコアの合計のスコアとの共通部分が得られます。

redisには存在しないので、存在するdoc1が存在しない要素を取得するのは難しいです。データ(および両方のセットに存在する要素のスコア)に応じて、これを行うことができます(すべてのスコア(「値」と呼ぶもの)が正であり、相互要素のスコアが両方のセットで同じであると仮定します)。doc2zdiff

zunionstore only_in_doc1 2 doc1 doc2 weights 1 -1
zremrangebyscore only_in_doc1 -inf 0
zrange only_in_doc1 0 -1 withscores
1) "989"
2) "4"
于 2012-05-29T09:50:06.523 に答える