是否可以通过提供一组常用字符串来“填充”zlib压缩器(或其他一些开源压缩引擎),以提高压缩大量非常相似的文本数据包的效率。一个?
我正在努力改进我的数百万XML数据包的方案,这些数据包不仅高度冗余,而且非常相似。通常,消息之间更改的字节数小于百分之一。但是,日志记录的目标之一是对半生不熟的客户端应用程序进行故障排除。这就是为什么我不能简单地对消息进行规范化或仅提取显着信息的原因:消息必须完全按照它们通过线路进行记录,字节为字节。
目前,利用消息之间冗余的唯一方法是将大量的消息捆绑在一起形成一个压缩数据包,比如100或1000,或者整天的价值。但是,这会使记录逻辑对我来说太复杂而且不那么健壮。更不用说并发进程和随机访问特定消息所带来的困难。
这就是为什么我认为我可以采取一些流压缩器并为它提供一堆常见字符串P来获取压缩文本ZP,然后通过为某些i提供P + message [i]来计算出稳定前缀并进行比较压缩后的结果为ZP。进入数据库的是没有公共前缀的压缩文本,然后在解压缩之前重新添加已知的公共前缀。在解压缩后,我会在公共前缀P之后采用该部分,显然。
一些测试表明,对于较小的消息,压缩比的增益将是一个或两个数量级,但不幸的是,这种技巧不适用于zlib deflate方法......
是否有其他方法可以获得类似的改进(存储要求大幅降低数量级)而无需上述消息捆绑方法的麻烦?理想情况下,接口应该只是foo_deflate(text)和foo_inflate(compressed_text),所有的技巧都隐藏在这两个函数的实现中。我并不害怕甩掉编译器并变脏,但所有的复杂性必须局限于压缩模块。换句话说,唯一可接受的接口更改是deflate / inflate函数的名称更改。捆绑方法不符合这一要求,并增加了一堆不确定的并发症。
以下是消息外观的示例,为了便于阅读而重新格式化并略微入侵以保护有罪:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
<foobarMeowMeow xmlns="http://bungle-and-botch.com/spec/abrechnungsservice/types">
<foobarMeowHiss xmlns="">
<?xml version="1.0" encoding="iso-8859-15"?>
<foobarMeowHiss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://bungle-and-botch.com/spec/abrechnungsservice">
<woeM>
...
</woeM>
<foobarMeowHiss;>
</foobarMeowHiss>
<foobarHissMeow>
<?xml version="1.0" encoding="iso-8859-15"?>
<foobarHissMeow xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://bungle-and-botch.com/spec/abrechnungsservice">
<jbrZ;>
...
答案 0 :(得分:1)
已在Is there a way to store gzip's dictionary from a file?中发布的答案。
魔法功能甚至在zlib manual解释,我没有足够的RTF:
int deflateSetDictionary (z_streamp strm, const Bytef *dictionary, uInt dictLength);
Mea culpa。