Thứ Sáu, 26 tháng 10, 2012

Nén và giải nén chuỗi trong C# (Compress and Decompress string C#)

Do nhu cầu công việc mình cần lưu trữ 1 nội dung rất lớn xuống database ( cụ thể là nội dung HTML của các website).
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ý.
  1. public static string Compress(string text)  
  2. {  
  3.     byte[] buffer = Encoding.UTF8.GetBytes(text);  
  4.     MemoryStream ms = new MemoryStream();  
  5.     using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true))  
  6.     {  
  7.         zip.Write(buffer, 0, buffer.Length);  
  8.     }  
  9.   
  10.     ms.Position = 0;  
  11.     MemoryStream outStream = new MemoryStream();  
  12.   
  13.     byte[] compressed = new byte[ms.Length];  
  14.     ms.Read(compressed, 0, compressed.Length);  
  15.   
  16.     byte[] gzBuffer = new byte[compressed.Length + 4];  
  17.     System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length);  
  18.     System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4);  
  19.     return Convert.ToBase64String(gzBuffer);  
  20. }  
  1. public static string Decompress(string compressedText)  
  2. {  
  3.     byte[] gzBuffer = Convert.FromBase64String(compressedText);  
  4.     using (MemoryStream ms = new MemoryStream())  
  5.     {  
  6.         int msgLength = BitConverter.ToInt32(gzBuffer, 0);  
  7.         ms.Write(gzBuffer, 4, gzBuffer.Length - 4);  
  8.   
  9.         byte[] buffer = new byte[msgLength];  
  10.   
  11.         ms.Position = 0;  
  12.         using (GZipStream zip = new GZipStream(ms, CompressionMode.Decompress))  
  13.         {  
  14.             zip.Read(buffer, 0, buffer.Length);  
  15.         }  
  16.   
  17.         return Encoding.UTF8.GetString(buffer);  
  18.     }  
  19. }  
Chú ý:
Đố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 (^^)!.

Thứ Hai, 22 tháng 10, 2012

Change Schema DB To DBO MS Sql Server

Lấy danh sách tất cả các table cần change Schema về dbo:
  1. SELECT 'ALTER SCHEMA dbo TRANSFER ' + SCHEMA_NAME(schema_id) + '.' + name  
  2. FROM sys.tables  
  3. WHERE schema_id != SCHEMA_ID('dbo'); 
Hoặc
  1. SELECT 'ALTER SCHEMA dbo TRANSFER ' + SCHEMA_NAME(schema_id) + '.' + name  
  2. FROM sys.objects  
  3. WHERE type='u' and schema_id != SCHEMA_ID('dbo');  
  4.       
Thực thi các câu truy vấn được tạo ra từ câu truy vấn trên.

Để change Schema cho Store Procedures thì làm tương tự (... from sys.procedures ...  hoặc ... from sys.objects where type='p' and ... ).

Xem thêm Xem danh sách các Object trong Database