Сжатие BitArray с GZip в C#
У меня есть BitArray с элементами 100M. Это около 12,5M . Я должен сжать этот массив. Я использую GZipStream Framework .
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;
}
}
Но размер переменной сжатых данных составляет 12515308. Это больше, чем исходный массив. Есть идеи?
Может быть, мне нужен еще один компрессор?
2 ответа
Вы пытались не использовать случайные данные? Данные, которые хорошо сжимаются, не случайны. Я считаю, что обычные алгоритмы сжатия ищут шаблоны битов для сжатия. В качестве простого теста вы можете записать эти случайные байты в файл, а затем посмотреть, что произойдет, когда вы заархивируете его.
Ни один компрессор не может сжимать действительно случайные данные. (Как было указано, вы можете сжать псевдослучайные данные, если сможете определить начальное число и алгоритм.)
Какова ваша заявка? У вас есть реальные данные для проверки?