一种文件更新方法及系统与流程

文档序号:14120028阅读:2479来源:国知局
一种文件更新方法及系统与流程

本发明涉及一种文件更新方法。



背景技术:

目前的更新策略多为更新包模式:将需要更新的资源整合制作成更新包;客户端将更新包下载下来,并将数据解压出来。这种模式最大的问题就是在跨版本更新的时候存在冗余数据更新,进而提高了下载的成本。还有一种是散文件模式:这种模式虽然不会有冗余数据出现,但是会有大量的碎片化的文件存在,十分影响下载的效率;同时,服务器上直接部署文件资源的源文件或源文件的压缩文件也让数据不够安全。

还有一种很受欢迎和推崇的方法是二进制更新,尽可能的让更新数据最小化,多用在android的apk更新。而这种方法如要实现跨版本更新,需要开发一个服务端程序去执行生成跨版本的更新包,并分发到每个下载服务器的节点。根据游戏大小的不同,这个生成时间会有比较大的差异,这样会无形中占用大量的用户的下载时间。如果没有服务器程序,跨版本更新也必然会有冗余资源;同时大文件在差异检测时效率并不高。

目前,游戏资源尤其是pc端资源体量越来越大,如:arkonline、黑暗与光明等原始资源已经超过70gb,用传统的更新方式效果并不理想。网络异常的情况下常常会因为下载失败一个文件需要重新下载很多。



技术实现要素:

本发明所要解决的技术问题是提供一种解决资源更新过程中减少下载量和优化下载效率的更新方法及更新系统。

为解决上述技术问题,本发明采用的技术方案是:

一种文件更新方法,包括文件打包步骤和更新下载步骤,其特征在于:

所述打包步骤包括:

文件检测步骤:做本地文件校验,将文件不存在或文件检测到差异的放入打包队列;

打包队列排序步骤:检测完毕将打包队列按照文件大小从大到小或者从小到大进行排序;

分块保存步骤:根据第一设定值,将打包队列内的文件划分为大文件和小文件;将大文件按第二设定值分成块文件,块文件名称以块文件的md5值命名,大文件以相对路径命名;将小文件压缩成不超过第三设定值的整合文件;保存文件索引信息配置文件,该文件索引信息配置文件包含大文件名称、块文件名称及整合文件的文件名称;

所述更新下载步骤包括:

配置文件下载步骤:下载文件索引信息配置文件;

检测步骤:根据下载的文件索引信息配置文件,检测版本是否需要更新;当版本需要更新时,检测本地的原始文件是否需要更新,并将需要更新的文件放入下载队列中;

更新文件下载步骤:从下载列队中下载需要更新的更新文件;对于小文件,从对应的整合文件中下载,大文件从块文件中筛选下载。

所述分块保存步骤中,对所述块文件进行压缩,并将压缩后块文件的文件名称添加到文件索引信息配置文件中。

所述更新文件下载步骤具体包括:

将需要下载的块文件压入下载队列,把直接拷贝的块文件放入文件对应的缓存队列;

从下载队列中取块文件去下载,并将下载好的数据压入对应的文件缓存队列;

从文件缓存队列中获取块文件完成下载。

所述块文件通过编辑距离算法进行筛选。

所述第一设定值为10mb-100mb。

第二设定值为为1mb-10mb。

第三设定值为100mb-500mb。

所述块文件为二进制文件。

一种文件更新系统,包括文件打包模块和更新下载模块,其特征在于:

所述文件打包模块包括:

文件检测单元:做本地文件校验,将文件不存在或文件检测到差异的放入打包队列;

打包队列排序单元:检测完毕将打包队列按照文件大小从大到小或者从小到大进行排序(文件大小由大到小,优先大文件下载可以避免io操作碎片化过早出现);

分块保存单元:根据第一设定值,将打包队列内的文件划分为大文件和小文件;将大文件按第二设定值分成块文件,块文件名称以块文件的md5值命名,大文件以相对路径命名;将小文件压缩成不超过第三设定值的整合文件;保存文件索引信息配置文件,该文件索引信息配置文件包含大文件名称、块文件名称及整合文件的文件名称;

所述更新下载模块包括:

配置文件下载单元:下载文件索引信息配置文件;

检测单元:根据下载的配置文件,检测版本是否需要更新;当版本需要更新时,检测本地的原始文件是否需要更新,并将需要更新的文件放入下载队列中;

更新文件下载单元:从下载列队中下载需要更新的更新文件;对于小文件,从对应的整合文件中下载,大文件从块文件中筛选下载。

与现有技术相比,本发明具有如下技术效果:

本发明提出一种大文件碎片化,小文件整合化的更新模式。部分引擎有自身包结构,有的甚至将全部文件封装到一个包中,导致一次微量资源更新也需要更新整个包,会有大量的冗余资源;在不区分包类型的前提下,大文件碎片化的更新策略优化网络资源和io资源的分配,在高带宽下网络波形更加稳定。本发明可尽可能减少冗余资源的下载同时最大化的利用网络资源的方式。更有效的利用客户端机器的资源,使在大体量资源更新时效果更佳出色:

1、块文件二进制保存,可以无视文件类型,使功能更加通用化。

2、大文件碎片化可以让解压操作在内存中进行减少io操作,同时整块的io操作效率更高,进而提升下载效率。

3、小文件整合又可以避免文件过于碎片而出现频繁建立http连接的情况,提升小文件的下载效率。

4、多线程流水线下载的模式,可以高效的利用网络资源,使下载波形更加稳定。

附图说明

图1是更新文件打包流程图;

图2是更新、下载流程图;

图3是数据块筛选示意图;

图4大文件下载流程图。

具体实施方式:

以arkonline游戏资源作为案例进行说明,该更新策略分为两个部分:打包和更新。策略的重点是更新部分。

打包的策略如图1,先做本地文件校验,文件不存在或文件检测到差异则放入打包队列;检测完毕将打包队列进行排序(文件大小由大到小,反之亦可);将大文件(10mb-100mb)以1mb-10mb为单元分二进制块,压缩保存本地,文件名称以本地保存的块文件的md5值命名;将小文件(小于等于10mb)压缩成一个整合文件,该整合文件大小不超过500mb;将大文件名称、块文件名称、块压缩文件的文件名称及整合文件的文件名称,保存作为该版本的文件索引信息。其中,块文件名称以块文件的md5值命名,大文件以相对路径命名,块压缩文件名称为块压缩后的md5,整合文件的文件名称为整合文件的md5。

打包就完成后,进行一个优化处理:大文件散列化后,本地会有很多的md5小块,同时会存在数据一致的情况(用md5进行校验,不考虑md5校验的碰撞情况),当一致时不用去重复打包;实际部署的时候也是这样散列的部署md5块,会发现因为有数据一致的情况,所以实际的资源部署会比散文件部署来的要小,这样会节省服务器的资源部署;同时,这样散列的部署资源在不了解内部数据结构的情况下外部很难将数据还原,数据会更加安全。更新策略如图2,首先下载必要的配置文件,包括基本信息配置文件、版本信息配置文件、文件索引信息配置文件等;检测版本是否需要更新;检测文件是否需要更新,并将需要更新的文件放入对应的队列中;下载合并或解压;

这里在检测更新时小文件只需要找到对应的整包文件进行下载即可;大文件可以做一个优化处理,这里使用编辑距离的算法对下载的数据块进行进一步的筛选。

数据块通过编辑距离算法进行筛选,分别为copy、modify、delete、insert,如图3。其中copy不需要下载,直接把本地数据拷贝到新文件中;delete不需要处理;modify和insert需要下载指定块,然后填入指定文件区域。因为数据块已经以1mb为单位分成多个块了,假定单个文件最大为2gb,数据块数量最大为2048个,编辑距离的算法空间复杂度o(n2),时间复杂度o(n2),2048无论在空间还是时间都能满足。

下载策略:为了提升细化数据的下载效率,稳定下载波形提出如下的下载方案,如图4:

thread1:主要负责文件的校验算法,并将需要下载的数据块压入下载队列,把直接拷贝的数据块放入文件对应的缓存队列;

thread2:主要负责从下载队列中取数据块去下载,并将下载好的数据压入对应的文件缓存队列;

thread3、thread4:主要负责写文件,从文件缓存队列中获取数据块并写入文件;

该结构是一个流水线系统,利用内存尽量降低网络下载和i/o操作相互之间的影响。下载数据的压入是实时的,但是防止i/o频繁操作,同时操作的大文件数量应该小于4个,理想是2个大文件同时操作。

数据块下载是多线程的,可以同时下载10-20个数据块,同时也应该对整体做限速操作。目前1g网络理论的下载速度为128mb/s,测试中最大速可达46mb/s左右,下载速度在超过10mb/s以后往往多线程文件的io操作会是整个系统的瓶颈,会有内存滞留,影响下载速度的情况(除非固态硬盘),所以限速10mb/s左右可以让整个系统运作更加流畅。

文件的缓存队列应该是一个有序队列,保证文件的写入是按索引顺序写入的,这样保证了i/o操作的流畅性;同时,当遇到索引断续的时候,比如:当前已经写到第10块,但是队列中没有第11块,这时需要等待第11块的出现,来保证顺序写入,当然下载也应该对这个现象进行适当的规避,需要做一个策略优先下载索引号小的块防止整体系统的阻塞;数据的解压在内存中操作,提高解压效率;文件写入可以使用内存映射文件机制来提高i/o读写效率,因为数据块是按照1mb分块,所以数据必然是系统分配粒度(windows是64kb)的整数倍;同一个文件下载过程中相同的数据块不用重复下载,进而进一步减少下载数据量;整包小文件的下载和传统方式相同,下载好文件解压出来即可。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1