验证一个网站是否支持 br 不支持的压缩算法 7z

百度拇指医生
&&&普通咨询
您的网络环境存在异常,
请输入验证码
验证码输入错误,请重新输入工具类服务
编辑部专用服务
作者专用服务
一个针对日志流分析的独立解压缩算法
当今因特网和云服务每天都要产生数量惊人的日志流,存储日志流消耗了大量的磁盘空间并产生巨额的开销。人们通常在将日志存储到磁盘前对其进行压缩以减少数据的大小,但传统的压缩方法在日志分析的场景中存在一个问题,即它们在获取相关的日志项时需要解压缩很多大块的数据,这使得解压缩过程很慢而且会消耗大量的计算资源。  本论文提出一个针对具有良好格式的日志流的列式压缩方法,这一方法使得每个日志条目在用于日志分析时能够独立解压缩。针对日志的特点,将每一个日志条目分成多个列,并对每个列采用不同的模型进行压缩。此外,还做了许多其他的改进,如将经常出现的模式视为短语,用辅助单词列表来处理压缩过程中遇到的新单词。已经将这一压缩方法实现为一个库并且将其向公众发布。还将其整合到两个不同的应用中,一个是日志搜索系统,另一个是日志连接系统。  实验结果表明我们的压缩策略(Cowic)在解压缩时间上胜于传统的压缩方法,同时有着与之相媲美的压缩率。对于Apache访问日志,Cowic压缩算法在使用0.1%的数据做训练集时压缩率为12.5%,只是略逊于gzip。在日志搜索系统中,当数据在内存时,Cowic比gzip快了3.6-71.1倍;而当数据在磁盘上时,Cowic比gzip快了30.4%-246.8%。在日志连接系统中,Cowic在达到相同的连接质量时,相比于未压缩的日志流只消耗了30%的内存。
学科专业:
授予学位:
学位授予单位:
导师姓名:
学位年度:
在线出版日期:
本文读者也读过
相关检索词
万方数据知识服务平台--国家科技支撑计划资助项目(编号:2006BAH03B01)(C)北京万方数据股份有限公司
万方数据电子出版社aa2brsetup解压密码,aa资源网默认解压密码_人工学院2_zodgame_aa2解压密码_aa游戏资源网解压密码_brautosetup 意外退出_aa2.part1 解压密码_ 解压密码_aa2至尊版解压密码 - 一点通中国领先的IT技术网站
51CTO旗下网站
浅谈XML压缩算法
在用XML传输数据的时候,XML本身的元素名称,属性名称可能比有效的信息量占的地方还要大,本文示例一种简单实用的算法来进行XML压缩,主要思路是把XML标签和属性用整数来表示以便降低传输量。
作者:蛙蛙池塘来源:JavaEye| 11:51
XML压缩单元测试代码class&Program&{ &&&&public&static&string&XML&=&@"&version=""1.0""&encoding=""utf-16""&&&&&&ALFKI&9572658&&AddressType=""work""&&&&&One&Main&Street&&&&&Anywhere&&&&&NJ&&&&&08080&&&&&&&10966&&&&&&&&&&&&&&&37&&&&&&&&&26.50&&&&&&&&&&8&&&&&&&&&Gravad&lax&&&&&&&&&&&&&  &&&&&&&&&&&&&&&&&&&56&&&&&&&&&&38.00&&&&&&&&&12&&&&&&&&&Gnocchi&di&nonna&Alice&&&&&&&&&&&&  &&&&&&&&&& &"; &static&void&Main(string[]&args)&{ &&&&&XmlZip&zip&=&new&XmlZip(); &&&&&&byte[]&bs&=&Encoding.UTF8.GetBytes(XML); &&&&&Console.WriteLine("原始文件长度:{0}",&bs.Length); &&&&&MemoryStream&ms&=&new&MemoryStream(); &&&&&DeflateStream&compressedzipStream&=&new&DeflateStream(ms,&press,&true); &&&&&compressedzipStream.Write(bs,&0,&bs.Length); &&&&&compressedzipStream.Close(); &&&&&Console.WriteLine("Deflate压缩后长度:&{0}",&ms.Length); &&&&&&zip.Init(XML); &&&&&bs&=&zip.XmlToBytes(XML); &&&&&Console.WriteLine("XML压缩后长度:{0}",&bs.Length); &&&&&string&str&=&zip.BytesToXml(bs); &&&&&Console.WriteLine("还原后长度:{0}",&Encoding.UTF8.GetByteCount(str)); &&&&&Console.WriteLine(str); &&&&&&&ms&=&new&MemoryStream(); &&&&&compressedzipStream&=&new&DeflateStream(ms,&press,&true); &&&&&compressedzipStream.Write(bs,&0,&bs.Length); &&&&&compressedzipStream.Close(); &&&&&Console.WriteLine("先XML压缩,再Deflate压缩后的长度:{0}",&ms.Length); &&&&&Console.ReadKey(); &&} &}&
原始文件长度:740
Deflate压缩后长度: 438
XML压缩后长度:295
还原后长度:727&version="1.0"&encoding="utf-16"&&&&ALFKI&&&9572658&&&&AddressType="work"&&&&&One&Main&Street&&&&&Anywhere&&&&&NJ&&&&&08080&&&&&&&&&&&10966&&&&&&&&&&&&37&&&&&&&26.50&&&&&&&&8&&&&&&&Gravad&lax&&&&&&&&&&&&&  &&&&&&&&&&&&&&&&&56&&&&&&&&38.00&&&&&&&12&&&&&&&Gnocchi&di&nonna&Alice&&&&&&&&&&&&  &&&&&&&&&&
先XML压缩,再Deflate压缩后的长度:357
可以看到,XML压缩后的数据约是原来数据的3分之一,可能没有其它专有的压缩算法的压缩率高,但效果还算是满意吧,而且我的算法是比较通用的,只要通信双方知道了XML的Schema,甚至双方只需要有一段完整的示例代码,就可以进行压缩通信,只做了功能测试,没做性能测试,大家可以先借鉴下思路。
大致原理,就是通信双方各持有一个XML文档节点名称,属性名称的一个字典,然后发送方传输的时候用ushort代替原有的XML标签和属性名,接收方通过字典把ushort再转换成原始的元素名和属性名,这样大量不必要的重复的标签等就省去了。
代码只做本文的示例,写的比较随意,没有什么防御性和健壮性。internal&enum&ItemType&{ &&&&&Element, &&&&&Attritube &} &internal&class&XmlNodeItem&{ &&&&&public&string&Xpath&{&&&} &&&&&public&string&Text&{&&&} &&&&&public&ItemType&ItemType&{&&&} &&&&&public&override&string&ToString()&{ &&&&&&&&&return&X &&&&&} &} &internal&class&MyXpath&{ &&&&&LinkedList&_node&=&new&LinkedList(); &&&&&public&void&AddElement(string&name)&{ &&&&&&&&&_node.AddLast(string.Format("/{0}",&name)); &&&&&} &&&&&public&void&AddAttribute(string&name)&{ &&&&&&&&&_node.AddLast(string.Format("/@{0}",&name)); &&&&&} &&&&&public&void&RemoveLastElement()&{ &&&&&&&&&_node.RemoveLast(); &&&&&} &&&&&public&override&string&ToString()&{ &&&&&&&&&StringBuilder&sb&=&new&StringBuilder(); &&&&&&&&&LinkedListNode&node&=&_node.F &&&&&&&&&sb.Append(node.Value); &&&&&&&&&while&((nodenode&=&node.Next)&!=&null)&{ &&&&&&&&&&&&&sb.Append(node.Value); &&&&&&&&&} &&&&&&&&&return&sb.ToString(); &&&&&} &} &class&XmlZip&{ &&&&&Dictionary,&XmlNodeItem&_map&=&new&Dictionary,&XmlNodeItem(); &&&&&Dictionary,&ushort&_map2&=&new&Dictionary,&ushort(); &&&&&MyXpath&_path&=&new&MyXpath(); &&&&&&public&void&Init(string&xmlInput)&{ &&&&&&&&&StringReader&sr&=&new&StringReader(xmlInput); &&&&&&&&&XmlReader&reader&=&XmlReader.Create(sr); &&&&&&&&&MemoryStream&ms&=&new&MemoryStream(); &&&&&&&&&ushort&i&=&1; &&&&&&&&&while&(reader.Read())&{ &&&&&&&&&&&&&switch&(reader.NodeType)&{ &&&&&&&&&&&&&&&&&case&XmlNodeType.Element: &&&&&&&&&&&&&&&&&&&&&_path.AddElement(reader.Name); &&&&&&&&&&&&&&&&&&&&&_map[i++]&=&new&XmlNodeItem()&{ &&&&&&&&&&&&&&&&&&&&&&&&&Xpath&=&_path.ToString(), &&&&&&&&&&&&&&&&&&&&&&&&&Text&=&reader.Name, &&&&&&&&&&&&&&&&&&&&&&&&&ItemTypeItemType&=&ItemType.Element &&&&&&&&&&&&&&&&&&&&&}; &&&&&&&&&&&&&&&&&&&&&if&(reader.HasAttributes)&{ &&&&&&&&&&&&&&&&&&&&&&&&&reader.MoveToFirstAttribute(); &&&&&&&&&&&&&&&&&&&&&&&&&_path.AddAttribute(reader.Name); &&&&&&&&&&&&&&&&&&&&&&&&&_map[i++]&=&new&XmlNodeItem()&{ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&Xpath&=&_path.ToString(), &&&&&&&&&&&&&&&&&&&&&&&&&&&&&Text&=&reader.Name, &&&&&&&&&&&&&&&&&&&&&&&&&&&&&ItemTypeItemType&=&ItemType.Attritube &&&&&&&&&&&&&&&&&&&&&&&&&}; &&&&&&&&&&&&&&&&&&&&&&&&&_path.RemoveLastElement(); &&&&&&&&&&&&&&&&&&&&&&&&&while&(reader.MoveToNextAttribute())&{ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&_path.AddAttribute(reader.Name); &&&&&&&&&&&&&&&&&&&&&&&&&&&&&_map[i++]&=&new&XmlNodeItem()&{ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Xpath&=&_path.ToString(), &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Text&=&reader.Name, &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&ItemTypeItemType&=&ItemType.Attritube &&&&&&&&&&&&&&&&&&&&&&&&&&&&&}; &&&&&&&&&&&&&&&&&&&&&&&&&&&&&_path.RemoveLastElement(); &&&&&&&&&&&&&&&&&&&&&&&&&} &&&&&&&&&&&&&&&&&&&&&&&&&reader.MoveToElement(); &&&&&&&&&&&&&&&&&&&&&} &&&&&&&&&&&&&&&&&&&&&if&(reader.IsEmptyElement)&_path.RemoveLastElement(); &&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&case&XmlNodeType.EndElement: &&&&&&&&&&&&&&&&&&&&&_path.RemoveLastElement(); &&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&default: &&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&} &&&&&&&&&} &&&&&&&&&foreach&(KeyValuePair,&XmlNodeItem&pair&in&_map)&{ &&&&&&&&&&&&&_map2[pair.Value.Xpath]&=&pair.K &&&&&&&&&} &&&&&} &&&&&&public&byte[]&XmlToBytes(string&xmlInput)&{ &&&&&&&&&StringReader&sr&=&new&StringReader(xmlInput); &&&&&&&&&XmlReader&reader&=&XmlReader.Create(sr); &&&&&&&&&MemoryStream&ms&=&new&MemoryStream(); &&&&&&&&&BinaryWriter&bw&=&new&BinaryWriter(ms); &&&&&&&&&while&(reader.Read())&{ &&&&&&&&&&&&&ushort& &&&&&&&&&&&&&byte[]& &&&&&&&&&&&&&switch&(reader.NodeType)&{ &&&&&&&&&&&&&&&&&case&XmlNodeType.Element: &&&&&&&&&&&&&&&&&&&&&_path.AddElement(reader.Name); &&&&&&&&&&&&&&&&&&&&&if&(_map2.TryGetValue(_path.ToString(),&out&index))&{ &&&&&&&&&&&&&&&&&&&&&&&&&bw.Write(index); &&&&&&&&&&&&&&&&&&&&&} &&&&&&&&&&&&&&&&&&&&&if&(reader.HasAttributes)&{ &&&&&&&&&&&&&&&&&&&&&&&&&reader.MoveToFirstAttribute(); &&&&&&&&&&&&&&&&&&&&&&&&&_path.AddAttribute(reader.Name); &&&&&&&&&&&&&&&&&&&&&&&&&if&(_map2.TryGetValue(_path.ToString(),&out&index))&{ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&_path.RemoveLastElement(); &&&&&&&&&&&&&&&&&&&&&&&&&&&&&bw.Write(index); &&&&&&&&&&&&&&&&&&&&&&&&&&&&&bs&=&Encoding.UTF8.GetBytes(reader.Value); &&&&&&&&&&&&&&&&&&&&&&&&&&&&&bw.Write((ushort)bs.Length); &&&&&&&&&&&&&&&&&&&&&&&&&&&&&bw.Write(bs); &&&&&&&&&&&&&&&&&&&&&&&&&} &&&&&&&&&&&&&&&&&&&&&&&&&while&(reader.MoveToNextAttribute())&{ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&_path.AddAttribute(reader.Name); &&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&(_map2.TryGetValue(_path.ToString(),&out&index))&{ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&_path.RemoveLastElement(); &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&bw.Write(index); &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&bs&=&Encoding.UTF8.GetBytes(reader.Value); &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&bw.Write((ushort)bs.Length); &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&bw.Write(bs); &&&&&&&&&&&&&&&&&&&&&&&&&&&&&} &&&&&&&&&&&&&&&&&&&&&&&&&} &&&&&&&&&&&&&&&&&&&&&&&&&reader.MoveToElement(); &&&&&&&&&&&&&&&&&&&&&} &&&&&&&&&&&&&&&&&&&&&if&(reader.IsEmptyElement)&{ &&&&&&&&&&&&&&&&&&&&&&&&&_path.RemoveLastElement(); &&&&&&&&&&&&&&&&&&&&&&&&&bw.Write(ushort.MaxValue); &&&&&&&&&&&&&&&&&&&&&} &&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&case&XmlNodeType.EndElement: &&&&&&&&&&&&&&&&&&&&&_path.RemoveLastElement(); &&&&&&&&&&&&&&&&&&&&&bw.Write(ushort.MaxValue); &&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&case&XmlNodeType.Text: &&&&&&&&&&&&&&&&&&&&&bw.Write((ushort)0); &&&&&&&&&&&&&&&&&&&&&bs&=&Encoding.UTF8.GetBytes(reader.Value); &&&&&&&&&&&&&&&&&&&&&bw.Write((ushort)bs.Length); &&&&&&&&&&&&&&&&&&&&&bw.Write(bs); &&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&default: &&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&} &&&&&&&&&} &&&&&&&&&bw.Close(); &&&&&&&&&ms.Close(); &&&&&&&&&reader.Close(); &&&&&&&&&return&ms.ToArray(); &&&&&} &&&&&&public&string&BytesToXml(byte[]&bytes)&{ &&&&&&&&&MemoryStream&ms&=&new&MemoryStream(bytes); &&&&&&&&&BinaryReader&br&=&new&BinaryReader(ms); &&&&&&&&&StringBuilder&sb&=&new&StringBuilder(); &&&&&&&&&StringWriter&sw&=&new&StringWriter(sb); &&&&&&&&&XmlWriterSettings&settings&=&new&XmlWriterSettings(); &&&&&&&&&settings.Indent&=&true; &&&&&&&&&XmlWriter&writer&=&XmlWriter.Create(sw,&settings); &&&&&&&&&&XmlNodeItem& &&&&&&&&&while&(br.PeekChar()&!=&-1)&{ &&&&&&&&&&&&&ushort&readFlag&=&br.ReadUInt16(); &&&&&&&&&&&&&int& &&&&&&&&&&&&&byte[]& &&&&&&&&&&&&&string& &&&&&&&&&&&&&if&(_map.TryGetValue(readFlag,&out&item))&{ &&&&&&&&&&&&&&&&&if&(item.ItemType&==&ItemType.Element) &&&&&&&&&&&&&&&&&&&&&writer.WriteStartElement(item.Text); &&&&&&&&&&&&&&&&&else&if&(item.ItemType&==&ItemType.Attritube)&{ &&&&&&&&&&&&&&&&&&&&&len&=&br.ReadUInt16(); &&&&&&&&&&&&&&&&&&&&&bs&=&br.ReadBytes(len); &&&&&&&&&&&&&&&&&&&&&str&=&Encoding.UTF8.GetString(bs); &&&&&&&&&&&&&&&&&&&&&writer.WriteAttributeString(item.Text,&str); &&&&&&&&&&&&&&&&&} &&&&&&&&&&&&&} &&&&&&&&&&&&&else&if&(readFlag&==&0)&{ &&&&&&&&&&&&&&&&&len&=&br.ReadUInt16(); &&&&&&&&&&&&&&&&&bs&=&br.ReadBytes(len); &&&&&&&&&&&&&&&&&str&=&Encoding.UTF8.GetString(bs); &&&&&&&&&&&&&&&&&writer.WriteString(str); &&&&&&&&&&&&&} &&&&&&&&&&&&&else&if&(readFlag&==&ushort.MaxValue)&{ &&&&&&&&&&&&&&&&&writer.WriteEndElement(); &&&&&&&&&&&&&} &&&&&&&&&} &&&&&&&&&writer.Flush(); &&&&&&&&&writer.Close(); &&&&&&&&&sw.Close(); &&&&&&&&&br.Close(); &&&&&&&&&return&sb.ToString(); &&&&&} &}&
【编辑推荐】
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
热点头条热点头条热点
24H热文一周话题本月最赞
讲师:41630人学习过
讲师:91988人学习过
讲师:16397人学习过
精选博文论坛热帖下载排行
为了满足广大考生的需要,我们组织了参与过多年资格考试命题或辅导的教师,以新的考试大纲为依据,编写了《数据库系统工程师考试全程指导》...
订阅51CTO邮刊Brotli压缩算法 - CSDN博客
Brotli压缩算法
https://indust.me/brotli-compression-format/
在去年9月, Google就已经在上发布了新的压缩算法Brotli,
并开源在了上.
同时还发布了一个, 対Brotli, Deflate, Zopfli, LZMA,
LZHAM和Bzip2这几种压缩算法进行了细致的对比. 从中我们可以知道Brotli的特性大概有这样几点:
对于典型的Web资源(html,css,js等), Brotli比Gzip性能好17–25%Brotli -1有着与Gzip -9相近的压缩比和更快的压缩解压速度多语言HTML文件压缩率有25%的提升(在对Alexa排名前一万个网站的测试中)JS/MinJS/CSS文件压缩率分别有17% 17%和20%的提升有效降低移动端浏览器加载网页耗费的数据流量和电量
经过大约半年的开发, 现在Chrome 49和Firefox 44以上的版本已经可以体验到这项新算法了.
不过在Chrome 49稳定版中Brotli默认没有启用, 需要到中手动启用, 启用后可以在请求头的Accept-encoding字段中看到br字样.
服务端也支持Brotli压缩算法的话就能在响应头中看到Content-Encoding: br.
在我所知道的站点中, 当前只有极少数启用了対Brotli的支持. 其中一个是Google Fonts API, 另一个是CloudFlare的.
值得庆幸的是,&和都提供了Brotli的Nginx模块.
我们可以自行编译来加入对Brotli的支持. 整个过程和配置其他模块没有太大的区别, 这里就简要地记录一下.
$ git clone /bagder/libbrotli
$ cd libbrotli
$ ./autogen.sh
$ ./configure --prefix=/usr
$ make && make install
$ ldconfig
$ git clone /google/ngx_brotli
$ cd nginx-1.x.x
$ ./configure --add-module=/path/to/ngx_brotli
$ mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
$ cp objs/nginx /usr/local/nginx/sbin/nginx
$ kill -USR2 `cat /var/run/nginx.pid`
$ kill -QUIT `cat /var/run/nginx.pid.oldbin`
# 修改配置文件, 参数和Gzip大致相同
brotli_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/javascript text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
brotli_buffers 4 16k;
brotli_comp_level 6;
brotli_window 512k;
brotli_min_length 512;
另外, 该模块和Gzip同样提供了一个变量$brotli_ratio,
可以用于在日志中记录压缩比.
本文已收录于以下专栏:
相关文章推荐
Brotli是google新开源的压缩算法。
简要介绍:
1. 官方介绍其压缩率要比gzip要减少20%,并且速度和性能和gzip差不多。
Google开源Brotli压缩算法
Brotli是一种全新的数据格式,可以提供比Zopfli高20-26%的压缩比。
在caniuse网站查询当前主流浏览器对brotli算法的支持程度,结果页面...
本文主要粗略介绍数据压缩主要算法类别,以及最新针对Web文本资源的zStd和Brotli算法的设计要点。为Web业务应用如何使用它们替换传统gzip提供些参考。最后是一个文本有损压缩的尝试。...
今天看到个google中文blog上面的一篇文章,看到其中有这么一段话
*2016 年,我们了解到,PNG 无损压缩得到了很大改进,而 Google 的 zopfli 工具是目前最先进的压缩工具。于...
Zopfli的最大特色是,假设你不介意极高的CPU要求,它就是“用完就丢”的一次性优化步骤,你可以应用在任何地方,而且不会受到任何伤害。...
前段时间一直在搞项目上线前的各种优化,关于贴图压缩这块也是需要针对不同的平台做不同的设置,这里备忘一下在各种平台中常使用的几种贴图压缩格式及其细节,以便更加适宜地选择在特定设备下的压缩格式以便节省资源...
他的最新文章
讲师:王禹华
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 br网站 的文章

 

随机推荐