我有一组double
值(1024 x 1024 矩阵)。我正在考虑使用lz4
压缩算法来压缩这些数据。压缩后,我必须将这些数据发送到服务器,然后在服务器端进行一些处理并将其返回到本地机器。我是压缩新手,有点困惑。
我是否需要先将这些double
值放入文件或其他格式中,然后进行压缩,或者我可以直接对值进行压缩而不将它们放入文件或其他格式中。
其次,如果您除了压缩还有其他建议lz4
,请分享。
我有一组double
值(1024 x 1024 矩阵)。我正在考虑使用lz4
压缩算法来压缩这些数据。压缩后,我必须将这些数据发送到服务器,然后在服务器端进行一些处理并将其返回到本地机器。我是压缩新手,有点困惑。
我是否需要先将这些double
值放入文件或其他格式中,然后进行压缩,或者我可以直接对值进行压缩而不将它们放入文件或其他格式中。
其次,如果您除了压缩还有其他建议lz4
,请分享。
您可以并且会直接将双打压缩为字节序列,每个双打八个。但是,您可能不会从中获得太多收益。
你对数据了解多少?它的范围是否受到限制?它的精度有限吗?这些值是否完全相互关联,例如相邻行或相邻列或两者中的项目是否可能彼此接近或接近线性级数或平滑曲线?有关数据的任何信息都允许您对其重新编码以占用更少的空间并使用预测器对其进行预处理以实现更好的压缩。
至于压缩器,这是时间和压缩比之间的权衡。对于高速但压缩较少的情况,lz4很好。对于高压缩但速度较慢且内存更多的情况,lzma很好。对于介于两者之间的东西,zlib是好的。
独立于压缩,您还需要确保服务器对双精度使用相同的格式。极有可能两者都使用 IEEE 754 格式作为双精度数,如今几乎每台机器都使用这种格式。但是,您需要检查表示的字节顺序。如果机器具有不同的字节序,您可能需要反转流中每个八字节双精度的字节顺序,即一个是小字节序(例如 Intel),另一个是大字节序(例如 Power PC 或 ARM)。
通常,无论何时在机器之间传输数据,都应该将其转换为标准格式——这称为编组或序列化。否则,如果两台机器对数字有不同的表示,则接收到的数据将无法正确解释。但是,如果您知道两台机器使用相同的二进制表示,您可以只发送二进制数据本身。
压缩算法通常适用于字节数组或流。char(*)
但是在传递给压缩函数之前,可以将双精度矩阵的地址转换为 a 。
不过,尚不清楚压缩双打能带来多少好处。压缩算法依赖于找到公共字节序列并用较短的占位符替换它们。二进制数据可能没有它们所依赖的冗余类型。
压缩算法通常对字节序列起作用。如果您愿意,它们可以从一个文件压缩到一个文件,或者从一块内存压缩到一块内存。只需链接到某人的压缩库(如 zlib 或其他),并将其指向您的双精度数组 - 库的压缩函数可能需要一个void *
参数和一个size_t
参数,该参数将愉快地接受您的双精度数组的地址和大小。它既不知道也不关心内存中是否包含双精度数。
Lempel-Ziv 等各种压缩算法都是无损的。在原始数据中寻找模式并用更少的字节表达数据。解压缩后,将重构整个精确的原始数据。
一些压缩方法是有损的,就像 .jpeg 和 .mpge 文件中使用的那样。
使用无损方法(如 LZ)压缩数字数据效果很好。如果您的代码需要更大的压缩率,请考虑简单转换为float
. 当然float
通常具有减小的范围和精度。如果这些影响是可以容忍的,那么这种有损预压缩float
将至少将原始大小减半,并可能提供更大的压缩比。
您的压缩不需要涉及首先写入文件。压缩可以在您的代码中进行。
切割器方法涉及通过外部进程(如compress
or )传输数据uncompress
。