代码之家  ›  专栏  ›  技术社区  ›  J.J

预压缩背后有科学依据吗?[已关闭]

  •  0
  • J.J  · 技术社区  · 8 年前

    这是我的问题-我有一个程序需要编写一些输出,而在压缩后,输出需要尽可能小。

    在这种情况下,人们可能会问自己的第一个问题是“我应该为我的数据使用什么数据结构?”。XML?JSON?SQLITE?TXT?结构?

    我认为说一个类似C的结构将给你提供尽可能小的文件是没有争议的 之前 压缩比任何其他格式都要小,但我正在努力找出将结构设计得尽可能小的“规则” 之后 压缩。所谓的“预压缩”工作。

    举个例子,我最近不得不存储一些尽可能紧凑的DNA。DNA有5个字母,“A”、“C”、“G”、“T”和“N”。N代表“不知道”。这意味着每个字符使用的最小二进制数是3位。

    000 = A
    001 = C
    010 = G
    011 = T
    100 = N
    

    所以我做了我认为正确的事情,写了一些代码,它采用一个恒定长度的DNA字符串,比如四个字母,比如“AACA”,然后将其转换为二进制形式 000 000 001 000 '然后返回两个字节' xxxx0000 ',' 00001000 '其中x是填充(也是0)。

    实际的程序提取了76个字母的DNA并返回29个字节,但其思想是相同的。然后,我将这29个字节写入一个结构(29个uint8字节),其中包含7211405个DNA片段,从而生成一个209130745字节或209Mb的文件。在LZMA压缩之后,此文件缩小到74.3Mb。

    然后,我决定重新运行相同的编码/压缩,但这次用4位编码DNA的每个字母。基本上,前一个文件的每4位现在是0.001变为0001,等等。生成的文件大小为274Mb,因此大65Mb,但压缩到70.2Mb,或小4.1Mb,这是最终文件大小的重要百分比。

    我在gzip、bzip2等中也看到了同样的情况。添加零以获得每个字节两个DNA字母有助于压缩器输出。那么现在怎么办?我还能做些什么来帮助压缩机?我还能做什么来获得更小的文件大小(无损)。

    我想的一个技巧是对要保存的DNA序列进行排序,并有一个单独的密钥,可以用来重新创建顺序。事实上,这是用

    my_array,key = numpy.unique(original_array, return_inverse=True)
    

    这使得 my_array original_array key 这是可以用来重新创建的myarray索引列表 理想情况下,my_array和key都能很好地压缩,但这两个文件的总和大致相当于开始时的未排序结构。在某些情况下小一点,在其他情况下大一点,但没有什么值得写的。

    另一个想法是使用完全不同的数据结构,比如图/树(仍然编码为结构,但每一行都是一个节点而不是一个条目),但我担心我认为压缩的方式是错误的。我知道我无法将文件大小缩小到熵的极限之外,但预压缩可能有一些秘诀,比如将数据与字节对齐,这比创建较小的未压缩文件更好,但压缩文件更大。

    我不是在问 “预压缩是我可以了解更多的东西吗?如果是的话,我要找的流行词/搜索词是什么?” .

    1 回复  |  直到 8 年前
        1
  •  0
  •   Ray    8 年前

    我知道我无法将文件大小缩小到超出熵的极限

    但你可以!许多压缩机经常这样做。问题是(香农)熵取决于pdf,即给定符号的概率分布。符号可以是“0”或“1”;或A、C、T、G和;N或高频等位基因。每一组符号都会给你不同的熵度量。找到正确的符号集,你就是黄金。

    像LZC这样的压缩器使用各种方法来动态调整二进制字符串上的pdf,有点难以击败。但是,如果您对数据有所了解,您可能能够改进它们。

    祝你好运