도구스개발

로어링 비트맵 크기 계산기

정수 집합을 로어링 비트맵으로 담았을 때의 크기를 조각별 컨테이너까지 나눠 계산합니다. 생 비트맵·정렬 배열과 견주고, 배열과 비트맵이 뒤집히는 4096 경계를 함께 보여 줍니다.

32비트 정수 전체라면 4294967296입니다

0이면 런 컨테이너를 쓰지 않습니다. 값이 이어져 있으면 작은 수를 넣어 보세요

바이트

조각 번호·원소 수·위치를 적는 자리입니다. 직렬화 형식마다 다릅니다

로어링이 가장 작습니다

248.24 KiB

로어링 · 조각 31개 사용 · 값 하나당 1.02비트 · 밀도 0.2%

로어링248.24 KiB
생 비트맵 (범위 전체를 비트로)119.21 MiB
정렬 배열 (32비트 × 개수)7.63 MiB
값 하나당 비트 (로어링)1.017비트
조각 (전체 / 쓰인 것)15,259 / 31
컨테이너개수조각당 원소하나 크기합계
비트맵3065,5368.00 KiB240.23 KiB
비트맵133,9208.00 KiB8.01 KiB
경계는 4096입니다. 조각 하나는 값 65,536개를 맡습니다. 배열로 담으면 하위 16비트만 적으면 되어 값 하나에 2바이트이고, 비트맵으로 담으면 8,192바이트 고정입니다. 2 × 4,096 = 8,192이므로 조각의 원소가 4,096개를 넘는 순간 뒤집힙니다. 조각 안 밀도로는 6.25%입니다. 로어링을 읽을 때 4096이라는 수가 자꾸 나오는 이유가 이것 하나입니다.
조각마다 «따로» 고르는 것이 로어링의 전부입니다. 실제 자료는 고르지 않습니다 — 어떤 구간은 빽빽하고 어떤 구간은 텅 비어 있습니다. 로어링은 빽빽한 조각은 비트맵으로, 성긴 조각은 배열로 담아 양쪽의 좋은 점만 가져갑니다. 지금 설정에서 «한곳에 몰림»으로 두었을 때 비트맵 30개, 비트맵 1개가 쓰입니다. 위에서 흩어진 모양을 바꿔 보면 컨테이너 구성이 통째로 달라집니다.
이기는 쪽이 밀도에 따라 뒤집힙니다. 생 비트맵은 원소 수와 무관하게 119.21 MiB 고정이라 성기면 낭비입니다. 정렬 배열은 범위와 무관하게 값 하나에 4바이트라 빽빽하면 커집니다. 지금은 밀도가 0.2%라 로어링이 가장 작습니다. 가운데 밀도에서 로어링이 이기는 것이 이 자료구조의 자리입니다.
값이 이어져 있다면 런을 넣어 보세요. 1000~5000처럼 연속된 값이 많으면 「시작과 길이」만 적는 런 컨테이너가 훨씬 작습니다. 위의 «조각당 연속 구간의 수»에 작은 값을 넣어 보면 크기가 얼마나 줄어드는지 보입니다.
블룸 필터와는 목적이 다릅니다. 블룸 필터나 HyperLogLog는 «틀려도 되는 대신 훨씬 작은» 확률적 구조입니다. 로어링은 «정확한» 집합이라 넣은 것이 그대로 나오고 교집합·합집합도 정확합니다. 크기를 견줄 때 이 차이를 빼놓으면 안 됩니다.
값이 흩어진 모양을 단순하게 봅니다. «몰림»은 앞 조각부터 꽉 채운 경우, «흩어짐»은 모든 조각에 고르게 나눈 경우입니다. 실제 자료는 그 사이 어딘가이므로 두 값이 위아래 경계라고 보면 됩니다. 컨테이너 부담도 직렬화 형식마다 달라 입력으로 두었습니다.

사용 방법

  1. 1담을 값의 개수와 값이 놓일 범위를 넣습니다.
  2. 2값이 한곳에 몰려 있는지 고르게 흩어져 있는지 고릅니다.
  3. 3조각별로 어떤 컨테이너가 쓰이는지, 전체 크기가 얼마인지 확인합니다.
  4. 4생 비트맵·정렬 배열과 견줘 어느 쪽이 이기는지 봅니다.

자주 묻는 질문

값을 상위 16비트로 갈라 65,536개씩 조각을 내고, 조각마다 따로 담는 방법을 고릅니다. 빽빽한 조각은 비트맵으로, 성긴 조각은 배열로 담습니다. 실제 자료는 고르지 않아서 어떤 구간은 빽빽하고 어떤 구간은 텅 비어 있는데, 조각마다 따로 고르기 때문에 양쪽의 좋은 점만 가져갑니다.

조각 하나에서 배열과 비트맵이 뒤집히는 지점이기 때문입니다. 조각 안에서는 하위 16비트만 담으면 되므로 배열은 값 하나에 2바이트이고, 비트맵은 65,536비트 곧 8,192바이트 고정입니다. 2 × 4096 = 8192이므로 조각의 원소가 4,096개를 넘는 순간 비트맵이 작아집니다. 조각 안 밀도로는 6.25%입니다.

값이 연달아 있을 때입니다. 1000부터 5000까지가 모두 들어 있다면 「시작과 길이」만 적는 편이 훨씬 작습니다. 런 하나에 4바이트라 원소가 아무리 많아도 런이 하나면 6바이트입니다. 다만 값이 다 흩어져 있어 런이 2,048개를 넘으면 비트맵보다 커집니다.

로어링은 정확한 집합이고 블룸 필터는 확률적 구조입니다. 블룸 필터나 HyperLogLog는 틀려도 되는 대신 훨씬 작지만, 로어링은 넣은 것이 그대로 나오고 교집합·합집합도 정확합니다. 크기만 견주면 로어링이 커 보이지만 하는 일이 다릅니다.

가운데 밀도에서입니다. 아주 성기면 정렬 배열이, 아주 빽빽하면 생 비트맵이 더 작습니다. 로어링의 자리는 그 사이, 특히 값이 고르지 않게 흩어져 있을 때입니다. 어떤 구간은 빽빽하고 어떤 구간은 비어 있는 자료에서 단순한 두 방법을 모두 이깁니다.

조각마다 「어느 조각인가」와 「원소가 몇 개인가」를 적어 두어야 해서 붙는 크기입니다. 정확한 크기는 직렬화 형식마다 다르므로 이 계산기는 입력으로 두었습니다. 기본값 8바이트는 조각 번호·원소 수·위치를 담는다고 본 값입니다.

어림값입니다. 값이 흩어진 모양을 「한곳에 몰림」과 「고르게 흩어짐」 두 가지로만 단순화했고, 실제 자료는 그 사이 어딘가입니다. 두 값이 위아래 경계라고 보면 됩니다. 컨테이너 부담과 직렬화 형식도 구현마다 다릅니다.

전송되지 않습니다. 계산은 모두 브라우저 안에서 이루어지고 넣은 값은 이 기기에만 남습니다.

알아두면 좋은 점

  • 값을 상위 16비트로 갈라 65,536개씩 조각을 내고 조각마다 컨테이너를 고릅니다.
  • 배열은 값 하나에 2바이트, 비트맵은 8,192바이트 고정입니다. 조각당 4,096개에서 뒤집힙니다.
  • 런 컨테이너는 런 하나에 4바이트입니다. 런이 2,048개를 넘으면 비트맵보다 커집니다.
  • 로어링은 정확한 집합입니다. 블룸 필터·HyperLogLog와 목적이 다릅니다.
  • 값이 흩어진 모양을 두 가지로 단순화했습니다. 실제 자료는 그 사이입니다.
  • 컨테이너 부담은 직렬화 형식마다 달라 입력으로 두었습니다.
  • 어림값입니다. 실제 라이브러리의 크기와 정확히 같지는 않습니다.

함께 보면 좋은 도구

마지막 검증: 2026년 9월 2일 · 결과는 참고용 추정치입니다.