块/区域压缩/解压缩

在这里阅读本文,作者写了关于块保存和使用查找表,然后将每个块保存在区域文件中,每个区域文件具有4096个块,每个块具有4096个字节的数据。 他构造它,使区域文件中的每个块偏移4096个字节 – 完美。 到目前为止,我已经很容易地用C#创建了它。

我的问题是现在与压缩。 如果我压缩每个块,这是伟大的,但我仍然有一个基于每个块4096偏移量的全长的区域文件 – 所以文件本身仍然看起来全尺寸尽管每个块被压缩并保存在它的4096字节分配。 我不想压缩整个区域文件,因为这是非常低效的,为了获得1个块,必须始终解压缩4096个区块。 在添加到区域文件之前,最好单独压缩每个块。

有人可以建议我可以解决这个问题,而无需调整区域文件的大小? 我不想每次修改时调整一个区域文件的大小,这也是本文的作者所避免的。 文件大小调整在性能上会过于昂贵。

你为什么不创建一个较小的分配单元大小(而不是每块4096)?

据我所知,每个块是4096字节长未压缩。 我猜这个地区的很多数据都是一样的,所以压缩了至less20倍,所以这是大约200个字节。 您可以压缩一堆块,并select足够小的分配单元大小,但仍适合大部分压缩的块。

如果分配单元大小为256个字节,则可以将大部分压缩块存储到一个单元中,然后填充数据,然后通过将单元添加到最多256个字节来完成单元。 如果块大于此值,则必须使用两个或更多个单元来存储它。

在这种情况下,你的偏移量会被搞乱,你将不得不创建一个头文件来存储从文件开始的每个块的偏移量,以256字节块的数量为单位。 鉴于你有4096块,你可以得到每个块2个字节。

另一种方法是select一个你知道的单位大小,对于压缩块来说不会太小,但这是一场赌博。

我知道这是一个迟到的答案,但它可能会帮助别人绊倒它。