Nén dữ liệu: đo thật

Sê-ri kỹ thuật về nén dữ liệu cho lập trình viên: entropy, Huffman, LZ77, DEFLATE, gzip/zstd/xz — mỗi bài đo tỉ lệ và tốc độ thật.

11/12 phần đã đăng Lập trình
1 Entropy và giới hạn nén: vì sao dữ liệu ngẫu nhiên không thể nén được Mọi thuật toán nén đều đụng một bức tường toán học: entropy Shannon. Bài này đo thật: chuỗi lặp một ký tự (entropy 0) gzip vụt còn 123 byte từ 90.000; nhưng 90.000 byte ngẫu nhiên (entropy 7.998 bit/byte) gzip làm nó phình lên 90.048 byte — không nén nổi. Và vì sao gzip nén text xuống dưới cả giới hạn entropy order-0: nó khai thác thêm sự lặp lại. 22/09/2026 · 7 phút đọc 2 Run-length encoding: thuật toán nén đơn giản nhất, thắng đậm và thua thảm RLE thay một dãy ký tự lặp bằng cặp (số lần, ký tự) — đơn giản đến mức viết trong vài dòng. Bài này tự cài RLE và đo thật: nó nén chuỗi lặp 90.000 byte còn 708 byte (127x), bitmap còn 93.5x, nhưng làm text tiếng Anh PHÌNH gấp đôi (93.800 thành 184.800 byte). Vì sao — và vì sao RLE vẫn là viên gạch nền của JPEG và nhiều thuật toán hiện đại. 22/09/2026 · 6 phút đọc 3 Huffman coding: gán mã ngắn cho ký tự phổ biến, tiến sát giới hạn entropy Vì sao dùng 8 bit cho mọi ký tự khi 'e' xuất hiện nhiều hơn 'z' hàng trăm lần? Huffman gán mã ngắn cho ký tự phổ biến, mã dài cho ký tự hiếm. Bài này tự cài Huffman bằng heap và đo thật: ký tự phổ biến nhất (khoảng trắng) được mã 2 bit, ký tự hiếm 7 bit; và tổng thể đạt 4.3507 bit/byte — chỉ hơn sàn entropy order-0 (4.3244) đúng 0.026 bit. Vì sao nó không chạm đúng entropy, và arithmetic coding làm gì tốt hơn. 22/09/2026 · 7 phút đọc 4 LZ77 và cửa sổ trượt: nén bằng cách trỏ về đoạn đã thấy, không viết lại Huffman khai thác tần suất nhưng mù với lặp lại. LZ77 lo phần đó: gặp đoạn đã xuất hiện, nó thay bằng tham chiếu ngược (lùi N byte, chép M byte). Bài này tự cài LZ77 và đo thật: trên một đoạn văn lặp câu, một token thay được nguyên 51 byte (distance=49, length=51), 9 tham chiếu nuốt 119/184 byte. Đây là chữ L và Z của gzip, zstd và gần như mọi thuật toán nén hiện đại. 22/09/2026 · 7 phút đọc 5 DEFLATE, gzip và zlib: mổ xẻ thuật toán nén phổ biến nhất thế giới gzip có mặt ở khắp nơi — HTTP, PNG, file .gz — và bên trong nó là DEFLATE: đúng hai thứ ta vừa học, LZ77 chồng lên Huffman. Bài này mổ header gzip thật byte-by-byte (magic 1f 8b, method 08, CRC32, kích thước gốc), so ba lớp vỏ DEFLATE raw / zlib / gzip khác nhau đúng 6 và 18 byte, và chứng minh sức mạnh nằm ở DEFLATE chứ không phải lớp vỏ: gzip level 0 làm dữ liệu to hơn, level 6 nén 153 lần. 22/09/2026 · 6 phút đọc 6 Mức nén gzip -1 tới -9: vì sao mặc định -9 thường là lãng phí Ai cũng từng gõ gzip -9 nghĩ 'nén tối đa'. Nhưng bài này đo thật trên 11MB log: từ gzip -6 lên -9 chỉ nhỏ hơn 7% mà chậm gấp 3.5 lần; zstd còn kịch tính hơn — từ -9 lên -19 nhỏ hơn 17% nhưng chậm gấp 36 lần. Đây là luật lợi ích giảm dần, và cách chọn mức nén theo cách dùng thay vì mặc định lấy mức cao nhất. 22/09/2026 · 6 phút đọc 7 gzip vs bzip2 vs xz vs zstd: bốn thuật toán nén, đo thật để biết chọn cái nào Bốn công cụ nén phổ biến, bốn triết lý khác nhau. Bài này nén cùng một file log 25MB bằng cả bốn và đo đủ bốn số: kích thước, tỉ lệ, thời gian nén, thời gian giải nén. Kết quả thật có bất ngờ: zstd -3 nén trong 61ms còn xz mất 7 giây; zstd giải nén 12ms bất kể mức nén; và bzip2 nén chặt nhất trên log này (13.3x) vì BWT hợp dữ liệu lặp. Khi nào chọn cái nào. 22/09/2026 · 7 phút đọc 8 zstd và từ điển: nén nghìn bản ghi JSON nhỏ từ 1.3x lên 4.4x Nén từng bản ghi nhỏ riêng lẻ (cache entry, message, log record ~200 byte) cho tỉ lệ tệ hại vì mỗi lần nén bắt đầu từ số 0. Bài này đo thật trên 3000 JSON nhỏ: nén riêng không từ điển chỉ được 1.3x, nhưng huấn luyện một từ điển 8KB bằng zstd --train rồi nén với nó đạt 4.4x — cải thiện 3.5 lần. Vì sao, và khi nào từ điển là công cụ đúng. 22/09/2026 · 7 phút đọc 9 Nén phụ thuộc dữ liệu: vì sao cùng gzip nén mã nguồn 292x mà nén ảnh 1x Không có 'tỉ lệ nén của gzip' — tỉ lệ phụ thuộc hoàn toàn vào dữ liệu, cụ thể là entropy của nó. Bài này đo thật cùng gzip trên nhiều loại 4MB: mã nguồn lặp nhiều nén 292 lần, JSON 15 lần, text 5 lần, nhưng số ngẫu nhiên và dữ liệu đã nén chỉ 1 lần (thậm chí to hơn). Và vì sao bạn không bao giờ nên gzip một file .jpg, .zip hay .mp4. 22/09/2026 · 6 phút đọc 10 Nén trong HTTP: vì sao trang web tải nhanh gấp 10 lần mà bạn không thấy gì Mỗi lần trình duyệt tải một trang, nó và server âm thầm thương lượng nén qua header Accept-Encoding và Content-Encoding. Bài này đo thật trên coffeecode.vn: trang chủ 245KB tải về chỉ còn 25KB nhờ gzip (nhỏ 9.8 lần). Và so gzip với brotli trên chính HTML đó — brotli nhỏ hơn gzip 24%. Cơ chế thương lượng, vì sao Vary: Accept-Encoding là bắt buộc, và chỉ nén text. 22/09/2026 · 6 phút đọc 11 Nén trong Go: compress/gzip, chọn mức, và nén luồng không nạp hết vào RAM Go có nén tích hợp trong thư viện chuẩn: compress/gzip, flate, zlib. Bài này đo thật: gzip BestSpeed nén 10MB trong 19ms, BestCompression trong 437ms (nhỏ hơn chưa tới 0.5%). Và cách nén theo luồng bằng io.Copy qua gzip.Writer để nén file 10GB với bộ nhớ vài chục KB. Kèm cái bẫy quên Close() làm hỏng dữ liệu, và cách tái dùng Writer bằng sync.Pool. 22/09/2026 · 6 phút đọc

Còn 1 phần nữa sẽ lần lượt được đăng.