安卓 Java使用相同的规则压缩多个字符串
我正在创建一个安卓应用程序,它需要一个巨大的数据库(70mb,但应用程序必须离线工作…)。最大的表有两列,一个关键字和一个定义。这些定义本身相对较短,通常不超过2000个字符,因此单独压缩每一个定义不会节省太多时间,因为压缩库将规则存储为压缩字符串的一部分来解压字符串
然而,如果我可以用相同的规则集压缩所有这些字符串,然后只将压缩后的数据存储在数据库中,并将规则存储在其他地方,我可以节省大量空间。有人知道有哪个图书馆会让我做这样的事吗
想要的行为:
public String getDefinition(String keyword) {
DecompressionObject decompresser = new DecompressionObject(RULES_FILE);
byte[] data = queryDatabase(keyword);
return decompresser.decompress(keyword);
}
# 1 楼答案
你所说的“规则”并不是你获得有限压缩效果的原因。在deflate流中,位于数据前面的哈夫曼代码表约为80字节,因此与2000字节的字符串相比并不重要
限制压缩效果的原因仅仅是缺乏绘制匹配字符串的历史记录。唯一可以查找匹配字符串的地方是在2000个字符中,然后在压缩过程中的任何一点上只查找前面的字符
要改进压缩,您可以创建一个通用字符串字典,将其用作压缩每个字符串之前的历史记录。然后,同样的字典会提前提供给解压器,以便解压器用来解压每个字符串。这是假设在你的字符串集合中有一些共同的内容
zlib在
deflateSetDictionary()
和inflateSetDictionary()
中提供这些函数