2012-05-03 4 views
0

BitArray에 100M 요소가 있습니다.이 크기는 약 12.5M입니다. 이 배열을 압축해야합니다. 프레임 워크의 GZipStream을 사용합니다.C에서 GZip으로 BitArray 압축 #

public static byte[] Compress(byte[] bytData) 
    { 
     try 
     { 
      MemoryStream ms = new MemoryStream(); 
      Stream s = new GZipStream(ms, CompressionMode.Compress); 
      s.Write(bytData, 0, bytData.Length); 
      s.Close(); 
      byte[] compressedData = ms.ToArray(); 
      return compressedData; 
     } 
     catch 
     { 
      return null; 
     } 
    } 

    static void Main(string[] args) 
    { 
     BitArray t = GetArray(); 
     byte []byteArray = new byte[100000000/8]; 
     t.CopyTo(byteArray, 0); 
     byte[] compressedData = Compress(byteArray); 
     Console.WriteLine(compressedData.Length); 
    } 
    public static BitArray GetArray() 
    { 
     Random r = new Random(); 
     BitArray result = new BitArray(100000000); 
     for (int i = 0; i < result.Count; i++) 
     { 
      if (r.NextDouble() > .5) 
      { 
       result.Set(i, true); 
      } 
     } 
     return result; 
    } 
} 

그러나 변수 compressedData의 크기는 12515308. 그것은 원래 배열 한 후 더 큰 것입니다. 어떤 아이디어?

다른 압축기가 필요합니까?

+3

압축은 데이터의 일반 시퀀스에 짧은 코드를 지정하고 희귀 시퀀스에 긴 코드를 할당하여 작동합니다. 데이터가 완전히 무작위 인 경우 자주 발생하는 시퀀스가 ​​많지 않으므로 결과가 원본보다 길어질 수 있습니다. 솔루션 : 임의의 데이터를 압축하지 마십시오. 아니면 PRNG (랜덤과 같은)를 사용하고 생성 된 값 ("절차 생성")보다는 시드 만 저장하면됩니다. – dtb

+0

Thx. 임의의 데이터를 사용해야합니다. GZip을 사용할 수 없습니다. 다른 압축기 일 수 있습니다. 이것은 정확히 임의의 숫자가 아니지만 무작위로 사용합니다. 이것은 사용자의 암호화 코드와 유사합니다. 그것은 무작위이어야합니다. – Leonid

+0

암호화 후에 압축하는 것은 종종 나쁜 생각입니다. 압축 오버 헤드가 발생하고 언급 된 이유로 인해 실제 크기가 작아지기 마련입니다. 가능한 경우 암호화하기 전에 데이터를 압축 해보십시오. 그러면 최상의 결과를 얻을 수 있습니다. – carlosfigueira

답변

1

임의의 데이터를 사용하지 않으셨습니까? 잘 압축되는 데이터는 무작위가 아닙니다. 나는 일반적인 압축 알고리즘이 압축하기 위해 비트 패턴을 찾는다 고 생각한다. 간단한 테스트로 임의의 바이트를 하나의 파일에 기록한 다음 파일을 압축하면 어떤 결과가 발생하는지 확인할 수 있습니다.

0

압축기가 없으면 진정한 무작위 데이터를 압축 할 수 없습니다. (시드와 알고리즘을 추론 할 수 있다면 의사 랜덤 데이터를 압축 할 수 있습니다.) 지적한대로 시드와 알고리즘을 추론 할 수 있습니다.

응용 프로그램이 무엇입니까? 테스트 할 실제 데이터가 있습니까?

+0

Hehehe 64 바이트 의사 난수를 4 바이트로 압축하는 방법 : [SEED, STREAM_LENGTH]? :) – JSideris

관련 문제