HYPERLOGLOG DATA-STRUCTURES ALGORITHMS DATA-ANALYSIS REAL-TIME ANALYTICS PERFORMANCE-OPTIMIZATION MEMORY-OPTIMIZATION SCALABILITY REDIS BACKEND-DEVELOPMENT OBSERVABILITY BIG-DATA ESTIMATION PROBABILISTIC-DATA-STRUCTURES

HyperLogLog: Jurus Rahasia Menghitung Unik Skala Besar dengan Memori Minimal

⏱️ 2 menit baca
👨‍💻

HyperLogLog: Jurus Rahasia Menghitung Unik Skala Besar dengan Memori Minimal

1. Pendahuluan

Sebagai developer web, kita sering dihadapkan pada kebutuhan untuk menghitung “jumlah unik” dari suatu entitas. Misalnya, berapa banyak unique visitors ke website kita hari ini? Berapa banyak unique users yang mengklik tombol tertentu? Atau berapa banyak unique IP addresses yang mengakses API kita?

Sekilas, ini terdengar mudah. Kita bisa menyimpan setiap entitas yang muncul, lalu menghitung totalnya. Tapi, bagaimana jika jumlah entitas unik itu mencapai jutaan, miliaran, bahkan triliunan? Data-data ini datang secara real-time dan harus dihitung dengan cepat. Jika kita menyimpan setiap item unik di memori, kita akan segera kehabisan RAM. Inilah masalah di balik penghitungan unik skala besar, dan di sinilah HyperLogLog (HLL) datang sebagai jurus rahasia.

Artikel ini akan membawa Anda menyelami HyperLogLog, sebuah algoritma probabilitas cerdas yang memungkinkan kita menghitung jumlah item unik (cardinality) dari dataset raksasa dengan jejak memori yang sangat kecil. Siap untuk mengoptimalkan analitik Anda? Mari kita mulai!

2. Mengapa Menghitung Unik itu Tantangan?

Untuk memahami mengapa HyperLogLog itu penting, mari kita lihat pendekatan tradisional dan masalahnya:

Pendekatan 1: Menyimpan Setiap Item Unik

Cara paling sederhana untuk menghitung item unik adalah dengan menyimpannya dalam sebuah Set (misalnya HashSet di Java, Set di JavaScript, atau SET di Redis).

# Contoh di Python
unique_items = set()
data_stream = ["user_a", "user_b", "user_a", "user_c", "user_b", "user_d"]

for item in data_stream:
    unique_items.add(item)

print(f"Jumlah unik: {len(unique_items)}") # Output: 4 (user_a, user_b, user_c, user_d)

Masalah: Memori yang dibutuhkan akan bertumbuh secara linier seiring dengan bertambahnya jumlah item unik. Jika Anda memiliki miliaran user_id unik, Anda akan membutuhkan RAM yang sangat besar, bahkan mungkin terabyte. Ini tidak praktis dan mahal untuk aplikasi skala besar.

Pendekatan 2: COUNT DISTINCT di Database

Jika data sudah ada di database, kita bisa menggunakan query SQL seperti SELECT COUNT(DISTINCT user_id) FROM events;.

SELECT COUNT(DISTINCT user_id) FROM events WHERE event_date = '2023-10-26';

Masalah: Meskipun nyaman, COUNT DISTINCT bisa sangat mahal secara komputasi dan I/O pada tabel dengan banyak baris, terutama jika tidak ada indeks yang dioptim