FLEX/flash/ajax利用压缩解决大数据量异步传输优化问题

本文数据有误,导致压缩效果结论严重偏离事实,正确的情况是,即使用DEFLATE压缩,和GZIP压缩效果相差无几,因为它们本来都是从哈夫曼编码中分支出来的。。。如果你还想了解下传输优化,可以搜索下 MessagePack 也许可以帮到你~

       首先,先想想我们异步传输的数据是什么,图片or文字?如果是图片视频类,sorry,下面内容不用看了,帮不了你。这里我们讨论的情况是传输文本,文字的情况(我相信99%的异步都是处理这方面的事情)。

        OK,先说说原理。为什么图片和视频类优化不了呢,原因就是,这些东东已经是2进制的了,而我们平常看的文本则是10进制的。如果我们在传输之前,把文本转为2进制压缩,在客户端接收到数据后再做2进制转10进制的解压缩,就可以大大的减少异步传输的数据量。我这里的测试结果是673KB的数据,经过2进制压缩,以及兼容性处理后,大小变为18KB,整整减少了99.97%的数据传输量。可以说,大大的降低了客户加载数据时间,客户体验上了几个层次。。

       单纯的转为二进制是不行D, 要把二进制进行压缩才能达到超级无敌的压缩效果。。这里偶尔陶醉我是使用PHP作为服务端的,客户端是使用FLEX。幸运的是,强大的PHP已经把这种压缩算法—deflate 内置到了PHP当中,在PHP中可以直接使用gzdeflate进行压缩,gzinflate进行解压缩。

什么是DEFLATE?

DEFLATE是同时使用了LZ77算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法。它最初是由Phil Katz为他的PKZIP归档工具第二版所定义的,后来定义在RFC 1951规范中。

人们普遍认为DEFLATE不受任何专利所制约,并且在LZW(GIF文件格式使用)相关的专利失效之前,这种格式除了在ZIP文件格式中得到应用之外也在gzip压缩文件以及PNG图像文件中得到了应用。

DEFLATE压缩与解压的源代码可以在自由、通用的压缩库zlib上找到。

       这是一个开源算法,应该会有什么版本都有的,其他语言都有这个内置算。客户端的话,我使用的FLEX也有这个算法包,只要import flash.utils.ByteArray; 就可以使用ByteArray对象调用inflate()函数进行解压。

       我相信看到这篇文章的都是程序猿多,说再多也没用,还不如直接贴源码。。。哈哈,最后附上源码。当然,只是一个简单的demo,方便大家理解而已。先讲解下,这个demo是模拟FLEX调用PHP的接口,PHP模拟压缩返回大量数据,FLEX接送到数据后做解压处理,然后画图(K线图)。

)。

 代码如下 复制代码
<?php  
$file = ‘c:/test.txt’;  
$content = file_get_contents($file);  
//file_put_contents(‘c:/1.txt’,base64_encode(gzdeflate($content,6)));  
header(“Content-Length:”.strlen( base64_encode(gzdeflate($content)) ));  
echo base64_encode(gzdeflate($content));  
 
?> 

以下是flex的代码,模拟股票K线图,需要调用大量数据。

 

 代码如下 复制代码

<?xml version=“1.0″ encoding=“utf-8″?> 

<s:Application xmlns:fx=“http://ns.adobe.com/mxml/2009″   

               xmlns:s=“library://ns.adobe.com/flex/spark”   

               xmlns:mx=“library://ns.adobe.com/flex/mx” minWidth=“955″ minHeight=“600″ creationComplete=“init()”> 

    <fx:Declarations> 

        <mx:HTTPService id=“srv” resultFormat=“text” useProxy=“false” result=“resultDatas(event)” /> 

          

        <!– K线图 上涨下跌2种样式 –> 

        <mx:SolidColor id=“up” color=“red” alpha=“.8″/> 

        <mx:SolidColor id=“down” color=“green” alpha=“.8″/> 

          

        <!– 一些线 –> 

        <mx:SolidColorStroke id=“line_ma5″ color=“#ff8040″ weight=“0.5″ alpha=“1″/> 

        <mx:SolidColorStroke id=“line_ma10″ color=“#60A2FF” weight=“0.5″/> 

        <mx:SolidColorStroke id=“line_ma20″ color=“#ff00ff” weight=“0.5″/> 

        <mx:SolidColorStroke id=“line_ma30″ color=“#008000″ weight=“0.5″/> 

        <!– 将非可视元素(例如服务、值对象)放在此处 –> 

    </fx:Declarations> 

    <fx:Script> 

        <![CDATA[  

            /*  

            * deflate.mxml  

            * 作者:偶尔陶醉  blog:www.stutostu.com  

            * 功能: 模拟股票K线图,向PHP接口调用大量数据  

            */  

            import flash.utils.ByteArray;  

              

            import mx.collections.ArrayCollection;  

            import mx.controls.Alert;  

            import mx.controls.Label;  

            import mx.rpc.events.ResultEvent;  

            import mx.utils.Base64Decoder;  

              

            import spark.components.TextArea;  

              

            private var str:String;  

            [Bindable]   

            private var _myData:ArrayCollection;  

            private var big:ArrayCollection;  

            private var page:int=1;  

            private var allpage:int;  

            private var start:int = 0;  

            private function init():void{  

                this.systemManager.stage.addEventListener(KeyboardEvent.KEY_DOWN ,_keyDownHandler);  

                srv.url = “http://localhost/test.php”;  

                srv.send();  

                  

            }  

              

            private function resultDatas(event:ResultEvent):void{  

                str = event.result.toString();  

                var base64:Base64Decoder = new Base64Decoder();  

                base64.decode( str );  

                var byte:ByteArray = new ByteArray();  

                byte = base64.toByteArray();  

                byte.inflate();  

                var result:String = byte.toString();  

                  

                var words:Array=result.split(‘;’);  

                var subwords:Array=[];    

                allpage = words.length-1;  

                var max:Number=1;  

                var min:Number=100000;  

                big = new ArrayCollection();  

                  

                Alert.show(“ooxx”);  

                for(var i:int = 0;i <= allpage;i++)  

                {  

                    subwords=words[i].split(‘,’);  

                    subwords[0] = subwords[0].substr(0,10);  

                    big.addItem({“Date”: subwords[0], “Open”: Number(subwords[1]), “High”:Number(subwords[2]),   

                        “Low”:Number(subwords[3]),”Close”:Number(subwords[4]),”Vol”:Number(subwords[5]),  

                        “Amount”:subwords[6],”VMa5″:subwords[7],”VMa10″:subwords[8],”VMa20″:subwords[9],  

                        “Ma5″:subwords[10],”Ma10″:subwords[11],”Ma20″:subwords[12],”Ma30″:subwords[13],  

                        “K”:subwords[14],”D”:subwords[15],”J”:subwords[16],”Diff”:subwords[17],  

                        “Dea”:subwords[18],”Macd”:subwords[19]});  

                }  

                  

                extrude();  

 

            }  

              

            public function extrude():void{  

                page <= 0 ? page = 1 : ”;  

                var end:int = page*30;  

                _myData = new ArrayCollection();  

                for(var i:int=0;i<=end;i++)  

                {  

                    _myData.addItem( {“Date”: big[i]['Date'], “Open”: big[i]['Open'], “High”:big[i]['High'],   

                        “Low”:big[i]['Low'],”Close”:big[i]['Close'],”Vol”:big[i]['Vol'],  

                        “Amount”:big[i]['Amount'] } );  

                }  

            }  

              

            protected function _keyDownHandler(event:KeyboardEvent):void{  

                switch(event.keyCode)  

                {  

                    case 38:  

                        page–;  

                        extrude();  

                        break;  

                    case 40:  

                        page++;  

                        extrude();  

                        break;  

                }  

            }  

              

        ]]> 

    </fx:Script> 

    <mx:CandlestickChart id=“candlestickchart” width=“100%” height=“70%” chromeColor=“#040404″ 

                         color=“#FFFFFF” dataProvider=“{_myData}” 

                         paddingLeft=“2″ showDataTips=“false” 

                         textAlign=“right” > 

        <mx:verticalAxis> 

            <mx:LinearAxis id=“vaxis” baseAtZero=“false” /> 

        </mx:verticalAxis> 

          

        <mx:verticalAxisRenderers>    

            <mx:AxisRenderer axis=“{vaxis}” placement=“left” labelGap=“0″ > 

                <mx:axisStroke> 

                    <mx:SolidColorStroke color=“#CCCCCC” weight=“1″ alpha=“0.8″ /> 

                </mx:axisStroke> 

            </mx:AxisRenderer> 

        </mx:verticalAxisRenderers> 

          

        <mx:horizontalAxis> 

            <mx:CategoryAxis id=“haxis” categoryField=“Date” /> 

        </mx:horizontalAxis> 

          

        <mx:horizontalAxisRenderers> 

            <mx:AxisRenderer axis=“{haxis}” canDropLabels=“true”> 

                <mx:axisStroke> 

                    <mx:SolidColorStroke color=“#bbccdd” weight=“1″ alpha=“0.8″/> 

                </mx:axisStroke> 

            </mx:AxisRenderer> 

        </mx:horizontalAxisRenderers> 

        <mx:series> 

            <mx:CandlestickSeries id=“main_line” 

                                  openField=“Open” 

                                  highField=“High” 

                                  lowField=“Low” 

                                  closeField=“Close” 

                                  fill=“{up}” 

                                  declineFill=“{down}” 

                                  /> 

            <mx:LineSeries yField=“Ma5″ lineStroke=“{line_ma5}”/> 

            <mx:LineSeries yField=“Ma10″ lineStroke=“{line_ma10}”/> 

            <mx:LineSeries yField=“Ma20″ lineStroke=“{line_ma20}”/> 

            <mx:LineSeries yField=“Ma30″ lineStroke=“{line_ma30}”/> 

        </mx:series> 

    </mx:CandlestickChart> 

</s:Application> 

 

哈哈,很简单的demo,希望能帮到你理解我在说什么。。。如果能帮到你,记得留言一下支持我哦。。。你也可以把这文章通过分享按钮分享给你朋友。。。

最后附上测试数据,也就是PHP中调用的test.txt 这个数据一共600多KB,测试一下吧,你会发现,压缩,真的很牛。。。

test.txt(右键另存为即可)

——————–bug修复——更新时间:2012/4/12 10:29———————-

在常规兼容性测试时,发现chrome返回压缩数据有问题。经查明,原因在于Transfer-Encoding:chunked 。 chrome 浏览器采用的是严格chunked协议,没有收到明确的chunked结束符会导致出错。所以只要在php输出数据前,用header设置一下Content-Length 告诉浏览器,返回的数据长度,就可避免这种情况发生。

时间: 2024-09-20 20:05:29

FLEX/flash/ajax利用压缩解决大数据量异步传输优化问题的相关文章

mysql-利用MySQL数据库如何解决大数据量存储问题?

问题描述 利用MySQL数据库如何解决大数据量存储问题? 各位高手您们好,我最近接手公司里一个比较棘手的问题,关于如何利用MySQL存储大数据量的问题,主要是数据库中的两张历史数据表,一张模拟量历史数据和一张开关量历史数据表,这两张表字段设计的很简单(OrderNo,Value,DataTime).基本上每张表每天可以增加几千万条数据,我想问如何存储数据才能不影响检索速度呢?需不需要换oracle数据库呢?因为我是数据库方面的新手,希望可以说的详细一点,万分感谢!!! 解决方案 查询业务是怎么样

mysql limit大数据量分页优化方法

Mysql的优化是非常重要的.其他最常用也最需要优化的就是limit.Mysql的limit给分页带来了极大的方便,但数据量一大的时候,limit的性能就急剧下降. 同样是取10条数据 select * from yanxue8_visit limit 10000,10 和 select * from yanxue8_visit limit 0,10 就不是一个数量级别的. 网上也很多关于limit的五条优化准则,都是翻译自Mysql手册,虽然正确但不实用.今天发现一篇文章写了些关于limit优

mysql limit 大数据量分页优化方法

Mysql的优化是非常重要的.其他最常用也最需要优化的就是limit.Mysql的limit给分页带来了极大的方便,但数据量一大的时候,limit的性能就急剧下降. 同样是取10条数据 select * from yanxue8_visit limit 10000,10 和 select * from yanxue8_visit limit 0,10 就不是一个数量级别的. 网上也很多关于limit的五条优化准则,都是翻译自Mysql手册,虽然正确但不实用.今天发现一篇文章写了些关于limit优

求mysql 大数据量问题解决方法?

问题描述 求mysql 大数据量问题解决方法? 一个mysql的数据表(大概有50000+)的数据,其中有一个字段的类型是blob的,存着相当大的二进制数据(大概有50k以上),有时候检索某个字段或者只是查询某个总共有几条数据就要相当长的时间,求有什么办法解决吗? 解决方案 把你经常需要查询的字段建立索引. 解决方案二: blob放在服务器上,然后用mysql记录它存放在服务器的地址.每次查就是根据地址来服务器取数据 解决方案三: MySQL数据库如何解决大数据量存储问题关于mysql大数据量分

小数据:解决大数据难题的“良药”

当前,随着大数据日渐炙手可热,大数据的应用也在逐渐深入,然而,围绕大数据的争论却从未停止过,依然非常激烈.其中一个原因就是,尽管前景美好.潜力巨大,但在"大体量"数据利用及实现商业价值的过程中往往充满挑战.非常棘手. 如首先,需要强大的机器和经验丰富的数据科学家将原始信息及庞大数据转化为洞察力.在这个过程中,如何去分配正确资源,并跨部门和学科去释义这些信息都非常困难.而当我们从数据中抽离出洞察见解之后,下一步该如何去利用这些洞察也一样充满困惑. 那么,在目前阶段,该怎么办呢?笔者认为解

利用Cache缓存数据DataTable数据提高大数据量访问性能

cache|访问|缓存|数据|性能 引言:在数据量不大的情况下,程序怎么写基本上性能差别不大,但是当我们面对数以万计的数据的时候,我想性能就是个不得不考虑的问题了,每写一个方法,每填充一笔数据都要考虑到性能问题,否则服务器将承担巨大的执行开销,如果服务器性能不好可能立即就死在那里了,所以在大数据量频繁访问的页面上,我们就必须考虑如何提高页面的性能了,本文将提供一种用cache提高访问性能的方法来解决此问题,在很大程度上提高页面加载数据的性能.本文列举的是论坛版块中帖子列表页面加载数据的实例.正文

WCF大数据量压缩传输,web.config怎么配置?

问题描述 准备做个新的项目,因为wcf有数据传输的限制,所以准备压缩后再传输到客户端处理:有一个博客,是使用gzipstream压缩的,这里他说的只要引用dll,然后配置config就自动压缩解压了,但是这里报错:求助大牛,或者讲一下怎么在配置文件中自动压缩解压,还有就是大数据量传输用这种方式合适吗? 解决方案 解决方案二:自己顶,等待大牛!解决方案三:那个可以无视,可以正常运行的.解决方案四:引用2楼qldsrx的回复: 那个可以无视,可以正常运行的. 客户端引用服务就不行了...解决方案五:

马云再次炮轰银行希望利用互联网的大数据去改造银行业

在日前召开的浙商大会上,马云( 微博)再度因"炮轰银行"的言论成为焦点人物之一.他在谈及金融改革时直言银行没有发挥好手中牌照的作用,"靠今天这样的机制,我不相信还能够支撑30年以后中国所需要的金融体系",并表示希望利用互联网的大数据去改造银行业. 日前,支付宝控股天弘基金引发金融业震动,与此同时,多家互联网企业纷纷推出金融理财产品.在业界看来,这标志着互联网金融的整合大幕即将拉开.马云昨日提到,中国不缺银行,但"缺乏一个对十年以后中国经济成长承担责任的金融

针对Sqlserver大数据量插入速度慢或丢失数据的解决方法

我的设备上每秒将2000条数据插入数据库,2个设备总共4000条,当在程序里面直接用insert语句插入时,两个设备同时插入大概总共能插入约2800条左右,数据丢失约1200条左右,测试了很多方法,整理出了两种效果比较明显的解决办法: 方法一:使用Sql Server函数: 1.将数据组合成字串,使用函数将数据插入内存表,后将内存表数据复制到要插入的表. 2.组合成的字符换格式:'111|222|333|456,7894,7458|0|1|2014-01-01 12:15:16;1111|222