2012-05-29 4 views
2

대용량 데이터에 대한 python dict를 사용하면 성능이 저하되므로 redis로 마이그레이션 할 수 있습니다. 그래서 나는 다음 있습니다 : 당신이 볼 수 그래서, 난 방식으로 파이썬을 사용하여 하나에 두 레디 스 목록을 결합하려는병합 및 합계 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에 없으면 결과에 요소를 추가하십시오. 내 이전 구현하여 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)} 

how to keep the structure of the dictionary

당신은이 솔루션입니다 볼 수 있듯이 : 그래서 내가이를 찾아야 목록에서 목록을 지원하지 않습니다

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

하지만 레디 스 다른 해결책. 값이 고유 경우

답변

2

, 당신은 sorted set 레디 스 사용할 수 있습니다

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" 

이이 점수를 당신에게 요소의 점수의 합을 (두 세트에 존재하는 요소) 세트의 교회법을 줄 것이다 각 집합에서.

doc1에 존재하지만 doc2이 아닌 요소를 얻으려면 까다롭기 때문에 zdiff이 없습니다. 데이터에 따라 (두 세트에있는 요소에 대한 점수가 무엇인지),이를 수행 할 수도 있습니다 ("값"이라고 부르는 모든 점수가 양수이고 상호 요소의 점수가 두 세트 모두에서 동일하다고 가정) :

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" 
+0

python에서 redis 명령을 실행하는 방법을 알고 있습니까? – badc0re