1 of 31

Count Min Sketch

대충 이해하기

강대명(charsyam@naver.com)

2 of 31

강대명 소개

  • 현) 레몬트리 CTO

  • 구) 위버스 데이터 엔지니어
  • 구) 유데미 데이터 엔지니어
  • 구) 카카오 백엔드 엔지니어
  • 구) 네이버 백엔드 엔지니어
  • 오픈소스 컨트리뷰터

3 of 31

Count를 확률적 자료구조

(Probabilistic Data Structures)

4 of 31

Count 를 위한 확률적 자료구조?

  • 먼저 다음과 같은 예를 들어봅시다.
    • 다음과 같이 IP들이 있는데, IP별로 개수를 세고 싶다.
    • 10.0.0.1, 10.0.0.1, 10.0.0.2, 10.0.0.3, 10.0.0.3, 10.0.0.3, 10.0.0.4

10.0.0.1

10.0.0.2

10.0.0.3

10.0.0.4

2

1

3

1

5 of 31

IP가 100만개 정도 되는데

Count를 해야 한다면?

6 of 31

IP 개수에 따른 메모리 할당 양

  • IP 개수가 늘어날 수록 메모리 사용량도 늘어난다.

개수

메모리(Redis에서 계산)

10000

1.64MB

100000

8.69MB

1000000

77.49MB

2000000

123.64MB

7 of 31

IP는 특정 IP 들이 많을까?

모두 동일한 횟수로 접근할까?

8 of 31

TOP(K)의 Count가 정확해야할 때

Count Min Sketch 가 유리

9 of 31

근사한 Count 값을 구하는 것이 목적

10 of 31

계산 시간과 메모리를 적게 사용하면 좋겠다.

11 of 31

d = 몇 개의 hash 함수를 쓸 것인가?

w = 메모리 공간을 얼마나 쓸 것인가?

(어라, BloomFilter와 비슷하네?)

12 of 31

Count Min Sketch

  • 할당되는 메모리는 w * d * 변수 크기 만큼 사용된다.

0

1

2

3

4

5

hash1

hash2

hash3

hash4

w: 사용하고자 하는 메모리 공간

d

13 of 31

hash는 서로 다른 hash를 사용

hash % w 값을 이용

(이것도 BloomFilter 랑 유사하네?)

14 of 31

다음과 같은 데이터셋이 있다고 가정한다.

1.1.1.1

2.2.2.2

1.1.1.1

3.3.3.3

1.1.1.1

15 of 31

최초

  • 최초에는 모두 0으로 셋팅

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

16 of 31

Add : 1.1.1.1

  • hash1(1.1.1.1) = 1
  • hash2(1.1.1.1) = 5
  • hash3(1.1.1.1) = 2
  • hash4(1.1.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

17 of 31

Add : 2.2.2.2

  • hash1(2.2.2.2) = 2
  • hash2(2.2.2.2) = 4
  • hash3(2.2.2.2) = 4
  • hash4(2.2.2.2) = 2
  • 나온 해시 값의 자리를 1 증가시킨다.

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

18 of 31

Add : 1.1.1.1

  • hash1(1.1.1.1) = 1
  • hash2(1.1.1.1) = 5
  • hash3(1.1.1.1) = 2
  • hash4(1.1.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

19 of 31

Add : 3.3.3.3

  • hash1(3.3.3.3) = 1
  • hash2(3.3.3.3) = 3
  • hash3(3.3.3.3) = 5
  • hash4(3.3.3.3) = 2
  • 나온 해시 값의 자리를 1 증가시킨다.

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

20 of 31

Add : 1.1.1.1

  • hash1(1.1.1.1) = 1
  • hash2(1.1.1.1) = 5
  • hash3(1.1.1.1) = 2
  • hash4(1.1.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

21 of 31

Count : 1.1.1.1

  • hash1(1.1.1.1) = 1
  • hash2(1.1.1.1) = 5
  • hash3(1.1.1.1) = 2
  • hash4(1.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 이다.

22 of 31

Count : 3.3.3.3

  • hash1(3.3.3.3) = 1
  • hash2(3.3.3.3) = 3
  • hash3(3.3.3.3) = 5
  • hash4(3.3.3.3) = 2

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이 된다.

23 of 31

BloomFilter 와 유사하게 Hash를 사용한다.

여러 hash 중에 가장 작은 값이 자기의 Count 값과

유사할 것이라는 점을 이용

24 of 31

w가 1000000이고 d 가 4라면

4 * 1000000 * 4 해서

16mb 정도로 메모리를 사용

16mb < 77.49MB

25 of 31

Count Min Sketch는 Hash의 충돌을 감안

고정된 크기에서 특정 값의 개수를

근사치로 구할 수 있다.

26 of 31

실제 값 <= 근사치 값

27 of 31

w와 d를 늘릴 수록 충돌이 줄어드므로

에러 값이 줄어든다.

28 of 31

근사값이라 운이 나쁘면 튀는 값이 나올 수도 있음.

29 of 31

여러 hash 값 들 중에 가장 적은 값이

해당 값에 가장 가까운 근사값

30 of 31

Reference

  • 확률적 자료구조를 이용한 추정 - 빈도(Frequency) 추정을 위한 Count-Min Sketch

31 of 31

감사합니다.