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. 그것은 원래 배열 한 후 더 큰 것입니다. 어떤 아이디어?
다른 압축기가 필요합니까?
압축은 데이터의 일반 시퀀스에 짧은 코드를 지정하고 희귀 시퀀스에 긴 코드를 할당하여 작동합니다. 데이터가 완전히 무작위 인 경우 자주 발생하는 시퀀스가 많지 않으므로 결과가 원본보다 길어질 수 있습니다. 솔루션 : 임의의 데이터를 압축하지 마십시오. 아니면 PRNG (랜덤과 같은)를 사용하고 생성 된 값 ("절차 생성")보다는 시드 만 저장하면됩니다. – dtb
Thx. 임의의 데이터를 사용해야합니다. GZip을 사용할 수 없습니다. 다른 압축기 일 수 있습니다. 이것은 정확히 임의의 숫자가 아니지만 무작위로 사용합니다. 이것은 사용자의 암호화 코드와 유사합니다. 그것은 무작위이어야합니다. – Leonid
암호화 후에 압축하는 것은 종종 나쁜 생각입니다. 압축 오버 헤드가 발생하고 언급 된 이유로 인해 실제 크기가 작아지기 마련입니다. 가능한 경우 암호화하기 전에 데이터를 압축 해보십시오. 그러면 최상의 결과를 얻을 수 있습니다. – carlosfigueira