为什么我的基于Bitarray的压缩代码需要如此多的内存?

时间:2017-06-01 15:47:24

标签: c# memory compression bitarray

我正在尝试编写一个带霍夫曼编码的压缩器。该过程涉及使用Bitarray存储值。一切都很好,花花公子,直到我加载稍大的东西。

目前我的节目载入93mb mp4视频。部分编码过程如下所示。

var encodedSource = new List<bool>();
var bitList = new List<BitArray>();
var listSize = 0;
foreach (var t in source)
{
     var encodedSymbol = new bool[dictionary[t].Length];
     dictionary[t].CopyTo(encodedSymbol,0);
     encodedSource.AddRange(encodedSymbol);
     if (encodedSource.Count > 1000000)
     {
         bitList.Add(new BitArray(encodedSource.ToArray()));
         listSize += encodedSource.Count;
         encodedSource = new List<bool>();
     }
}
var bits = new BitArray(listSize);
var index = 0;
foreach (var bitArray in bitList)
{
    foreach (var b in bitArray)
        {
            bits[index++] = (bool) b;
        }
}

encodedSource和bitList似乎占用了太多的空间,他们应该需要(组合完成后它们需要大约800mbs)。

编码完成后,将bitList复制成位,然后复制一个字节数组,最后复制该文件。比特似乎是正常大小,大约90mb,并且带有标题和91mb的东西的结果文件也是正常的。我似乎无法弄清楚为什么encodedSource和bitList占用了这么多空间,或者找到一些可以节省一些空间的方法。

---解释代码---

我将字节和转换加载到字典中以加快查找速度(时间从5分钟到69秒) bitList的存在是因为将它保存到encodedSource会占用太多空间,将其复制到bitList占用大约一半的内存,仍然超过实际应用的1/8,但更少。

编辑:没有意识到我实际上没有提出问题。问题是,为什么需要这么多空间?我该怎么做才能减轻这种影响?

另外,我已经考虑过简单地每X位直接写入文件,但是我还没有解决这个问题,我想在到达之前解决这个问题,但如果需要,我可以这样做

0 个答案:

没有答案