整数CSV压缩算法

时间:2016-04-24 22:19:47

标签: csv compression

我做了关于压缩逗号分隔整数的算法存在的表面层次研究,但是我找不到任何相关的东西。

我的目标是压缩大量已知值范围的结构化逗号分隔整数。有没有已知的算法来做这样的事情?如果不是在哪里开始阅读一些感兴趣的相关领域,这将使我开始开发这样的算法?当然,算法必须是可逆的和损失的,以便我可以解压缩压缩数据以检索csv值。

数据结构是三个值的数组,第一个数字域是0到4,第二个是0到6,第三个是0到n,其中n不是大数。重复此结构以创建二维数组中的数据。

2 个答案:

答案 0 :(得分:0)

除非你的列表中有一些特定的结构,你没有泄露,并且可能会极大地帮助压缩,标准的无损压缩算法如gzipbzip2应该处理一串数字就好了。

这些常用算法的库应该可以在几乎所有语言和平台上普遍使用。

答案 1 :(得分:0)

在结构化数据上使用gzip或bzip2等标准压缩算法无法获得最佳的压缩效率,因此构建一个特定于案例的算法就可以了。

数据结构如下所示。

// cell: a data structure, array of three numbers
// digits[0]: { 0, 1, 2, 3, 4 }
// digits[1]: { 0, 1, 2, 3 }
// digits[2]: { 0, 1, 2, ..., n } n is not an absurdly large number
// Below it is reused in a multi-dimensional array.
var cells = [
    [ [3, 0, 1], [4, 2, 4], [3, 0, 2], [4, 1, 3] ],
    [ [4, 2, 3], [3, 0, 3], [4, 3, 3], [1, 1, 0] ],
    [ [3, 3, 0], [2, 3, 1], [2, 2, 5], [0, 2, 4] ],
    [ [2, 1, 0], [3, 0, 0], [0, 2, 3], [1, 0, 0] ]
];

我使用标准压缩算法对此数据结构进行了各种测试(将白色空格排除为字符串):

  • gz从171压缩到88字节
  • bzip2从171压缩到87字节
  • 将压缩从171压缩到76字节

我构造的算法将数据压缩到33个字节,直到n = 192.因此,在特定情况下,我能够以超过两倍的标准文本压缩算法效率压缩我的数据。

我实现这种压缩的方法是将单元格可以容纳的所有不同组合的可能值映射到整数。如果你想研究这样一个概念,它就被称为数学中的组合学。然后,我将基数10整数转换为更高的基数,用于字符串表示。

由于我的目标是人类可用性(压缩代码将被输入)我使用了基础62,我分别表示为{[0-9],[a-z],[A-Z]}从0到61。转换为Base62时,我将单元长度缓冲为两位数。这允许62 * 62(3844)种不同的细胞组合。

最后,我在压缩字符串的开头添加了一个基数为62的数字,表示列数。解压缩y大小用于从字符串的长度推导出x大小。因此,可以正确地解压缩数据而不会丢失数据。

上例的压缩字符串如下所示:

var uncompressed = compress(cells); // "4n0w1H071c111h160i0B0O1s170308110"

我已经解释了我的方法来解决我的问题,以帮助其他人面临类似的问题。出于默默无闻的原因,我没有提供我的代码。

<强> TL; DR

压缩结构化数据:

  1. 将离散对象表示为整数
  2. 将基数10整数编码为更高的基数
  3. 对所有对象重复
  4. 在压缩字符串中添加行数或列数
  5. 解压缩结构化数据:

    1. 读取行或列,并从字符串长度中推断出另一个
    2. 反向压缩步骤1和2
    3. 对所有对象重复