2016-06-22 52 views
0

我有一块我想压缩的数据块,比如可变大小的C结构。我想压缩数据,但在应用程序代码中即时访问结构的特定字段,而无需解压缩整个数据。从原始数据的偏移中即时解压缩数据?

是否有一个算法可以获得偏移量(对于原始数据),解压缩并返回数据?

回答

1

压缩方法通常通过利用前面的数据来实现压缩。在压缩数据中的任何一点,您都需要知道至少一些前面未压缩的数据,才能解压后面的内容。

您可以故意忘记压缩数据中选定点的历史记录,以便在这些点上进行随机访问。这会将压缩量减少一定量,但对于距离足够远的随机接入点来说,这可能会很小。一个简单的方法是使用gzip压缩碎片并连接gzip流,保留每个流的偏移记录。为了减少开销,您可以在zlib中使用Z_FULL_FLUSH来做同样的事情。

或者,您可以将每个随机访问点的历史记录保存在单独的文件中。在zran.c中可以找到构建zlib或gzip流的随机访问索引的示例。

您可以构建不依赖于以前的解压缩历史的压缩方法,如简单的霍夫曼编码。然而与依赖于以前的历史的方法相比,压缩比将会很差。

+0

谢谢。我还可以写回压缩数据吗? –

+0

不是,不,因为您无法预测压缩数据的大小。 –

0

压缩文件系统示例:我们有一个文件系统API,它不需要知道在写入磁盘之前发生的压缩。那里有几个算法。 查询here了解更多详情。

但是,试图优化使用的数据结构可能会有更多的收益,因此不需要对它们进行压缩? 为了高效访问,需要索引。因此,在数组和MultiMaps和Sparse Arrays之间,应该有一种方法来模拟数据,因为数据可以高效地表示,所以不需要进一步压缩。 当然,这在很大程度上取决于很模糊的用例。

需要一个压缩层来访问数据的用例可以想像,但很可能有更好的方法来解决这个问题。