这是我的问题-我有一个程序需要编写一些输出,而在压缩后,输出需要尽可能小。
在这种情况下,人们可能会问自己的第一个问题是“我应该为我的数据使用什么数据结构?”。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都能很好地压缩,但这两个文件的总和大致相当于开始时的未排序结构。在某些情况下小一点,在其他情况下大一点,但没有什么值得写的。
另一个想法是使用完全不同的数据结构,比如图/树(仍然编码为结构,但每一行都是一个节点而不是一个条目),但我担心我认为压缩的方式是错误的。我知道我无法将文件大小缩小到熵的极限之外,但预压缩可能有一些秘诀,比如将数据与字节对齐,这比创建较小的未压缩文件更好,但压缩文件更大。
我不是在问
“预压缩是我可以了解更多的东西吗?如果是的话,我要找的流行词/搜索词是什么?”
.