Count Min Sketch
대충 이해하기
강대명(charsyam@naver.com)
강대명 소개
Count를 확률적 자료구조
(Probabilistic Data Structures)
Count 를 위한 확률적 자료구조?
10.0.0.1 | 10.0.0.2 | 10.0.0.3 | 10.0.0.4 |
2 | 1 | 3 | 1 |
IP가 100만개 정도 되는데
Count를 해야 한다면?
IP 개수에 따른 메모리 할당 양
개수 | 메모리(Redis에서 계산) |
10000 | 1.64MB |
100000 | 8.69MB |
1000000 | 77.49MB |
2000000 | 123.64MB |
IP는 특정 IP 들이 많을까?
모두 동일한 횟수로 접근할까?
TOP(K)의 Count가 정확해야할 때
Count Min Sketch 가 유리
근사한 Count 값을 구하는 것이 목적
계산 시간과 메모리를 적게 사용하면 좋겠다.
d = 몇 개의 hash 함수를 쓸 것인가?
w = 메모리 공간을 얼마나 쓸 것인가?
(어라, BloomFilter와 비슷하네?)
Count Min Sketch
| 0 | 1 | 2 | 3 | 4 | 5 |
hash1 | | | | | | |
hash2 | | | | | | |
hash3 | | | | | | |
hash4 | | | | | | |
w: 사용하고자 하는 메모리 공간
d
hash는 서로 다른 hash를 사용
hash % w 값을 이용
(이것도 BloomFilter 랑 유사하네?)
다음과 같은 데이터셋이 있다고 가정한다.
1.1.1.1
2.2.2.2
1.1.1.1
3.3.3.3
1.1.1.1
최초
| 0 | 1 | 2 | 3 | 4 | 5 |
hash1 | 0 | 0 | 0 | 0 | 0 | 0 |
hash2 | 0 | 0 | 0 | 0 | 0 | 0 |
hash3 | 0 | 0 | 0 | 0 | 0 | 0 |
hash4 | 0 | 0 | 0 | 0 | 0 | 0 |
Add : 1.1.1.1
| 0 | 1 | 2 | 3 | 4 | 5 |
hash1 | 0 | 1 | 0 | 0 | 0 | 0 |
hash2 | 0 | 0 | 0 | 0 | 0 | 1 |
hash3 | 0 | 0 | 1 | 0 | 0 | 0 |
hash4 | 0 | 1 | 0 | 0 | 0 | 0 |
Add : 2.2.2.2
| 0 | 1 | 2 | 3 | 4 | 5 |
hash1 | 0 | 1 | 1 | 0 | 0 | 0 |
hash2 | 0 | 0 | 0 | 0 | 1 | 1 |
hash3 | 0 | 0 | 1 | 0 | 1 | 0 |
hash4 | 0 | 1 | 1 | 0 | 0 | 0 |
Add : 1.1.1.1
| 0 | 1 | 2 | 3 | 4 | 5 |
hash1 | 0 | 2 | 1 | 0 | 0 | 0 |
hash2 | 0 | 0 | 0 | 0 | 1 | 2 |
hash3 | 0 | 0 | 2 | 0 | 1 | 0 |
hash4 | 0 | 2 | 1 | 0 | 0 | 0 |
Add : 3.3.3.3
| 0 | 1 | 2 | 3 | 4 | 5 |
hash1 | 0 | 3 | 1 | 0 | 0 | 0 |
hash2 | 0 | 0 | 0 | 1 | 1 | 2 |
hash3 | 0 | 0 | 2 | 0 | 1 | 1 |
hash4 | 0 | 2 | 2 | 0 | 0 | 0 |
Add : 1.1.1.1
| 0 | 1 | 2 | 3 | 4 | 5 |
hash1 | 0 | 4 | 1 | 0 | 0 | 0 |
hash2 | 0 | 0 | 0 | 1 | 1 | 3 |
hash3 | 0 | 0 | 3 | 0 | 1 | 1 |
hash4 | 0 | 3 | 2 | 0 | 0 | 0 |
Count : 1.1.1.1
| 0 | 1 | 2 | 3 | 4 | 5 |
hash1 | 0 | 4 | 1 | 0 | 0 | 0 |
hash2 | 0 | 0 | 0 | 1 | 1 | 3 |
hash3 | 0 | 0 | 3 | 0 | 1 | 1 |
hash4 | 0 | 3 | 2 | 0 | 0 | 0 |
각 자리의 값을 정한다.
(hash1, 1) = 4, (hash2, 5) = 3, (hash3, 2) = 3, (hash4, 1) = 3
이때 4, 3, 3, 3 중에서 가장 작은 MIN 값은 3이므로 1.1.1.1의 개수는 3이 된다. 이래서 Count Min Sketch 이다.
Count : 3.3.3.3
| 0 | 1 | 2 | 3 | 4 | 5 |
hash1 | 0 | 4 | 1 | 0 | 0 | 0 |
hash2 | 0 | 0 | 0 | 1 | 1 | 3 |
hash3 | 0 | 0 | 3 | 0 | 1 | 1 |
hash4 | 0 | 3 | 2 | 0 | 0 | 0 |
(hash1, 1) = 4, (hash2, 3) = 1, (hash3, 2) = 1, (hash4, 1) = 2
이때 4, 1, 1, 2 중에서 가장 작은 MIN 값은 1이므로 3.3.3.3의 개수는 1이 된다.
BloomFilter 와 유사하게 Hash를 사용한다.
여러 hash 중에 가장 작은 값이 자기의 Count 값과
유사할 것이라는 점을 이용
w가 1000000이고 d 가 4라면
4 * 1000000 * 4 해서
16mb 정도로 메모리를 사용
16mb < 77.49MB
Count Min Sketch는 Hash의 충돌을 감안
고정된 크기에서 특정 값의 개수를
근사치로 구할 수 있다.
실제 값 <= 근사치 값
w와 d를 늘릴 수록 충돌이 줄어드므로
에러 값이 줄어든다.
근사값이라 운이 나쁘면 튀는 값이 나올 수도 있음.
여러 hash 값 들 중에 가장 적은 값이
해당 값에 가장 가까운 근사값
Reference
감사합니다.