我正在尝试编写一个带霍夫曼编码的压缩器。该过程涉及使用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位直接写入文件,但是我还没有解决这个问题,我想在到达之前解决这个问题,但如果需要,我可以这样做