Với số lượng record lên đến hàng trăm ngàn, lượng dữ liệu lưu xuống là cực kỳ lớn, lên đến hàng chục GB. Dữ liệu thực sự của công ty là hàng triệu, có thể tưởng tưởng ra cái database để lưu trữ nó to đến mức nào ^^!.
Cho nên trước khi lưu xuống mình nén nội dung lại để giảm bớt dung lượng lưu trữ.
Cách làm này giúp tiết kiệm dung lượng lưu trữ rất lớn (Mình áp dụng test 100.000 record thì thấy database chỉ còn 1/3 so với khi chưa nén). Tuy nhiên khi cần ta không thể thực hiện các xử lý tính toán trực tiếp với dữ liệu này dưới SQL được mà cần phải lấy dữ liệu lên, giải nén ngược trở lại rồi xử lý.
- public static string Compress(string text)
- {
- byte[] buffer = Encoding.UTF8.GetBytes(text);
- MemoryStream ms = new MemoryStream();
- using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true))
- {
- zip.Write(buffer, 0, buffer.Length);
- }
- ms.Position = 0;
- MemoryStream outStream = new MemoryStream();
- byte[] compressed = new byte[ms.Length];
- ms.Read(compressed, 0, compressed.Length);
- byte[] gzBuffer = new byte[compressed.Length + 4];
- System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length);
- System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4);
- return Convert.ToBase64String(gzBuffer);
- }
- public static string Decompress(string compressedText)
- {
- byte[] gzBuffer = Convert.FromBase64String(compressedText);
- using (MemoryStream ms = new MemoryStream())
- {
- int msgLength = BitConverter.ToInt32(gzBuffer, 0);
- ms.Write(gzBuffer, 4, gzBuffer.Length - 4);
- byte[] buffer = new byte[msgLength];
- ms.Position = 0;
- using (GZipStream zip = new GZipStream(ms, CompressionMode.Decompress))
- {
- zip.Read(buffer, 0, buffer.Length);
- }
- return Encoding.UTF8.GetString(buffer);
- }
- }
Đối với chuỗi dữ liệu lớn thì khi nén lại sẽ giảm kích thước rất nhiều. Trường hợp chuỗi ít hơn khoảng 300 hay 400 ký tự gì đấy (mình chưa test giới hạn) thì khi nén kết quả lại lớn hơn chuỗi ban đầu đấy (^^)!.