使用C压缩双值

时间:2015-01-09 00:30:52

标签: c compression double lz4

我有一个double值的数据集(1024 x 1024矩阵)。我想使用lz4压缩算法来压缩这些数据。压缩后,我必须将此数据发送到服务器,然后在服务器端进行一些处理并将其返回到本地计算机。我是压缩的新手,很少有人混淆。

我是否需要首先将这些double值放在文件或其他格式中,然后进行压缩,或者我可以直接对值进行压缩,而不将它们放在文件或其他格式中。

其次,如果您在lz4旁边有任何其他建议进行压缩,请分享。

4 个答案:

答案 0 :(得分:3)

你可以并且会直接将双打压缩为一个字节序列,每双八个。但是,你可能无法获得太大的收益。

您对数据了解多少?它的范围是否受到限制?它的精度有限吗?这些值是否完全相互关联,例如相邻行或相邻列中的项目,或两者,可能彼此接近或接近线性进展或平滑曲线?有关数据的任何信息都允许您重新编码以减少空间并使用预测变量对其进行预处理以获得更好的压缩。

对于压缩机,这是时间和压缩比之间的权衡。对于高速但压缩较少,lz4是好的。对于高压缩但速度较慢且内存较多,lzma是好的。对于介于两者之间的东西,zlib是好的。

独立于压缩,您还需要确保服务器使用相同的double格式。两者都极有可能使用IEEE 754格式的双倍,这几乎是现在每台机器都能做到的。但是,您需要检查表示的结束。如果机器具有不同的字节顺序,您可能需要反转流中每个8字节双精度的字节顺序,即一个是小端(例如Intel),另一个是大端(例如Power PC或ARM)。

答案 1 :(得分:2)

通常,只要您在计算机之间传输数据,就应将其转换为标准格式 - 这称为编组序列化。否则,如果两台机器对数字有不同的表示,则数据在收到时不会被正确解释。但是,如果您知道这两台机器使用相同的二进制表示,则只需发送二进制数据本身。

压缩算法通常适用于字节数组或流。但是,在传递给压缩函数之前,双精度矩阵的地址可以转换为char(*)

但是,目前尚不清楚压缩双打会从中获得多少好处。压缩算法依赖于查找公共字节序列并用较短的占位符替换它们。二进制数据可能没有它们所依赖的冗余类型。

答案 2 :(得分:1)

压缩算法通常适用于字节序列。如果您愿意,它们可以从文件压缩到文件,或从内存块压缩到内存块。只需链接某人的压缩库(如zlib或其他东西),并将其指向您的双精度数组 - 库的压缩函数可能需要void *参数和{{1可以愉快地接受双数组的地址和大小的参数。它既不知道也不关心记忆包含双打。

答案 3 :(得分:1)

像Lempel-Ziv这样的各种压缩算法都是无损的。查找原始数据中的模式并以较少的字节表示数据。在解压缩时,重构完整的原始数据。

某些压缩方法与.jpeg和.mpge文件中使用的一样有损。

使用无损方法(如LZ)压缩数值数据效果很好。如果您的代码需要更高的压缩率,请考虑转换为float。当然float通常会缩小范围和精度。如果这些影响是可以容忍的,那么对float的这种有损预压缩将至少使原始大小减半,可能提供更高的压缩率。

您的压缩不需要首先写入文件。压缩可以在您的代码中完成。

切割方法涉及通过compressuncompress等外部流程管理您的数据。