首页 / 专利库 / 物理 / 淘析器 / 下载资源的方法及装置

下载资源的方法及装置

阅读:341发布:2020-12-06

专利汇可以提供下载资源的方法及装置专利检索,专利查询,专利分析的服务。并且一种下载资源的方法及装置,应用于对等计算机P2P网络,包括:根据来自资源 请求 方的下载请求,启动下载任务;获取所述下载任务的数据,并将所述下载任务的数据写入内存;从所述内存中读取所述数据并提供给所述资源请求方。本 申请 能够减少资源下载对磁盘带来的损耗。,下面是下载资源的方法及装置专利的具体信息内容。

1.一种下载资源的方法,应用于对等计算机P2P网络,包括:
根据来自资源请求方的下载请求,启动下载任务;
获取所述下载任务的数据,并将所述下载任务的数据写入内存;
从所述内存中读取所述数据并提供给所述资源请求方。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
在所述内存中的数据达到预先设定的使用上限时,确定所述下载任务是否完整,所述下载任务完整表示所述下载任务能够获取到完整资源;
在所述下载任务不完整时,过滤所述下载任务,以便不将所述内存中的数据写入磁盘。
3.根据权利要求1所述的方法,其特征在于,所述方法还包括:
在所述内存中的数据达到预先设定的使用上限时,确定所述下载任务是否完整,所述下载任务完整表示所述下载任务能够获取到完整资源;
在确定所述下载任务完整时,将所述内存中的数据写入磁盘。
4.根据权利要求2或3所述的方法,其特征在于,所述方法还包括:
根据所述下载请求中的Range信息,确定所述下载任务是否完整。
5.根据权利要求4所述的方法,其特征在于,所述方法还包括如下之一或两项:
判断所述下载请求的Range信息是否从0开始,在所述Range信息从0开始时确定所述下载任务完整;
根据所述下载请求中的Range信息,识别所述下载请求是否对应seek操作,在所述下载请求对应跳转Seek操作时确定所述下载任务不完整。
6.根据权利要求5所述的方法,其特征在于,所述根据所述下载请求中的Range信息,识别所述下载请求是否对应Seek操作,包括:
根据所述下载请求的Range信息与内存中已有的相应下载任务的Range信息,判断对应所述下载请求的数据与内存中已有的相应数据是否能够拼接为完整资源;
在对应所述下载请求的数据与内存中已有的相应数据能够拼接为完整资源时,判定所述下载请求不是对应Seek操作。
7.根据权利要求3所述的方法,其特征在于,所述将所述内存中的数据写入磁盘,包括:
所述内存中的数据达到预先设定的使用上限且所述下载任务完整时,在所述磁盘中创建文件并将所述内存中的数据写入所述文件中,或者直接打开所述下载任务对应的文件并将所述内存中的数据写入所打开的文件中。
8.根据权利要求3或7所述的方法,其特征在于,所述将所述内存中的数据写入磁盘,包括:
将所述内存中的数据拼成连续的数据后写入磁盘。
9.根据权利要求3或7所述的方法,其特征在于,所述方法还包括:
所述内存中的数据达到预先设定的使用上限且所述下载任务完整时,分析所述磁盘的剩余空间;在所述磁盘的剩余空间不足以存放所述内存中的数据时,执行淘汰资源的操作,以便将所述内存中的数据写入所述磁盘。
10.根据权利要求1至3任一项所述的方法,其特征在于,所述获取所述下载任务的数据,并将所述下载任务的数据写入内存,包括:
初始为所述下载任务分配一个或多个固定大小的内存块,并通过循环使用所述内存块将所述下载任务的数据写入内存。
11.根据权利要求1至3任一项所述的方法,其特征在于,所述获取所述下载任务的数据,并将所述下载任务的数据写入内存,包括:
初始为所述下载任务分配一个或多个固定大小的内存块;
收到所述下载任务的数据后,将所述数据写入所述内存块;在所述内存块写满时,释放部分或全部的所述内部块,以供后续收到的数据使用;如此循环,直至所述下载任务结束。
12.根据权利要求10所述的方法,其特征在于:将所述内存中的数据写入磁盘之后,释放所述数据在内存中占用的内存块。
13.根据权利要求10所述的方法,其特征在于:从所述内存中读取所述数据并提供给所述资源请求方之后,释放所述数据在所述内存中占用的内存块。
14.根据权利要求2或3所述的方法,其特征在于:
所述在所述下载任务不完整时,过滤所述下载任务,包括:在所述下载任务不完整时,将所述下载任务的下载模式设置为内存模式,所述内存模式下所述内存中的数据不会写入磁盘;
所述在所述下载任务完整时,将所述内存中的数据写入磁盘,包括:在所述下载任务完整时,将所述下载任务的下载模式设置为磁盘+内存的模式,所述磁盘+内存的模式下所述内存中的数据将会写入磁盘。
15.根据权利要求14所述的方法,其特征在于:
通过重置所述下载任务的下载模式参数设置所述下载任务的下载模式。
16.一种下载资源的装置,应用于对等计算机P2P网络,包括:
启动模块,用于根据来自资源请求方的下载请求,启动下载任务;
获取模块,用于获取所述下载任务的数据;
内存模块,用于将所述下载任务的数据写入内存;
提供模块,用于从所述内存中读取所述数据并提供给所述资源请求方。
17.根据权利要求16所述的装置,其特征在于,还包括:
确定模块,用于在所述内存中的数据达到预先设定的使用上限时,确定所述下载任务是否完整,所述下载任务完整表示所述下载任务能够获取到完整资源;
过滤模块,用于在所述下载任务不完整时,过滤所述下载任务,以便不将所述内存中的数据写入磁盘;
磁盘写模块,用于在确定所述下载任务完整时,将所述内存中的数据写入磁盘。
18.根据权利要求17所述的装置,其特征在于,
所述确定模块,具体用于根据所述下载请求中的Range信息,确定所述下载任务是否完整。
19.根据权利要求18所述的装置,其特征在于,所述确定模块,具体用于通过如下方式之一或两项确定所述下载任务是否完整:
判断所述下载请求的Range信息是否从0开始,在所述Range信息从0开始时确定所述下载任务完整;
根据所述下载请求中的Range信息,识别所述下载请求是否对应Seek操作,在所述下载请求对应跳转Seek操作时确定所述下载任务不完整。
20.根据权利要求17所述的装置,其特征在于,
所述磁盘写模块,具体用于:在所述内存中的数据达到预先设定的使用上限且所述下载任务完整时,在所述磁盘中创建文件并将所述内存中的数据写入所述文件中,或者直接打开所述下载任务对应的文件并将所述内存中的数据写入所打开的文件中。
21.根据权利要求17或20所述的装置,其特征在于,
所述磁盘写模块,具体用于:将所述内存中的数据拼成连续的数据块后写入磁盘。
22.根据权利要求16或17所述的装置,其特征在于,
所述内存模块,用于将所述下载任务的数据写入内存,包括:初始为所述下载任务分配一个或多个固定大小的内存块,并通过循环使用所述内存块将所述下载任务的数据写入内存。
23.根据权利要求16或17所述的装置,其特征在于,
所述内存模块,用于将所述下载任务的数据写入内存,包括:
初始为所述下载任务分配一个或多个固定大小的内存块;
将所述获取模块当前收到的数据写入所述内存块;在所述内存块写满时,释放部分或全部的所述内部块,以供所述获取模块后续收到的数据使用;如此循环,直至所述下载任务结束。
24.一种下载资源的装置,包括:
存储有计算机程序存储器
处理器,配置为读取所述计算机程序以执行如权利要求1至15任一项所述的方法。

说明书全文

下载资源的方法及装置

技术领域

[0001] 本发明涉及对等计算机(P2P,peer to peer)网络技术领域,尤其涉及一种下载资源的方法及装置。

背景技术

[0002] 相关技术中,P2P节点在下载资源的过程中是直接将该资源的数据写入磁盘。采用此方式下载某个资源时,即使是零散的、碎片化的数据也会直接写入磁盘,因而常需要多次反复向磁盘读写该资源的数据,不仅对磁盘造成了很大损耗,而且导致磁盘的利用率很低。
[0003] 而在P2P网络的各类节点中,有很多节点的存储能比较差,比如移动端和OTT端,这些P2P节点的磁盘不仅读写比较慢、存储容量小,而且读写次数也有限制,一旦写入次数过多,就会导致坏区,甚至坏卡。针对此类P2P节点,如果不论下载任务是否完整都写入磁盘的话,必然会大大缩短磁盘的寿命。
[0004] 综上,针对存储能力比较差的P2P节点,在某个资源的下载过程中如何减少对磁盘的损耗,是亟待解决的技术问题。

发明内容

[0005] 本申请旨在至少解决相关技术中的技术问题之一。
[0006] 本申请提供一种下载资源的方法及装置,至少能够减少资源下载对磁盘带来的损耗。
[0007] 本申请采用如下技术方案。
[0008] 一种下载资源的方法,应用于对等计算机P2P网络,包括:
[0009] 根据来自资源请求方的下载请求,启动下载任务;
[0010] 获取所述下载任务的数据,并将所述下载任务的数据写入内存;
[0011] 从所述内存中读取所述数据并提供给所述资源请求方。
[0012] 其中,所述方法还包括:在所述内存中的数据达到预先设定的使用上限时,确定所述下载任务是否完整,所述下载任务完整表示所述下载任务能够获取到完整资源;在所述下载任务不完整时,过滤所述下载任务,以便不将所述内存中的数据写入磁盘。
[0013] 其中,所述方法还包括:在所述内存中的数据达到预先设定的使用上限时,确定所述下载任务是否完整,所述下载任务完整表示所述下载任务能够获取到完整资源;在确定所述下载任务完整时,将所述内存中的数据写入磁盘。
[0014] 其中,所述方法还包括:根据所述下载请求中的Range信息,确定所述下载任务是否完整。
[0015] 其中,所述方法还包括如下之一或两项:
[0016] 判断所述下载请求的Range信息是否从0开始,在所述Range信息从0开始时确定所述下载任务完整;
[0017] 根据所述下载请求中的Range信息,识别所述下载请求是否对应seek操作,在所述下载请求对应跳转Seek操作时确定所述下载任务不完整。
[0018] 其中,所述根据所述下载请求中的Range信息,识别所述下载请求是否对应Seek操作,包括:
[0019] 根据所述下载请求的Range信息与内存中已有的相应下载任务的Range信息,判断对应所述下载请求的数据与内存中已有的相应数据是否能够拼接为完整资源;
[0020] 在对应所述下载请求的数据与内存中已有的相应数据能够拼接为完整资源时,判定所述下载请求不是对应Seek操作。
[0021] 其中,所述将所述内存中的数据写入磁盘,包括:
[0022] 所述内存中的数据达到预先设定的使用上限且所述下载任务完整时,在所述磁盘中创建文件并将所述内存中的数据写入所述文件中,或者直接打开所述下载任务对应的文件并将所述内存中的数据写入所打开的文件中。
[0023] 其中,所述将所述内存中的数据写入磁盘,包括:将所述内存中的数据拼成连续的数据后写入磁盘。
[0024] 其中,所述方法还包括:所述内存中的数据达到预先设定的使用上限且所述下载任务完整时,分析所述磁盘的剩余空间;在所述磁盘的剩余空间不足以存放所述内存中的数据时,执行淘汰资源的操作,以便将所述内存中的数据写入所述磁盘。
[0025] 其中,所述获取所述下载任务的数据,并将所述下载任务的数据写入内存,包括:初始为所述下载任务分配一个或多个固定大小的内存块,并通过循环使用所述内存块将所述下载任务的数据写入内存。
[0026] 其中,所述获取所述下载任务的数据,并将所述下载任务的数据写入内存,包括:初始为所述下载任务分配一个或多个固定大小的内存块;收到所述下载任务的数据后,将所述数据写入所述内存块;在所述内存块写满时,释放部分或全部的所述内部块,以供后续收到的数据使用;如此循环,直至所述下载任务结束。
[0027] 其中,将所述内存中的数据写入磁盘之后,释放所述数据在内存中占用的内存块。
[0028] 其中,从所述内存中读取所述数据并提供给所述资源请求方之后,释放所述数据在所述内存中占用的内存块。
[0029] 其中,所述在所述下载任务不完整时,过滤所述下载任务,包括:在所述下载任务不完整时,将所述下载任务的下载模式设置为内存模式,所述内存模式下所述内存中的数据不会写入磁盘;所述在所述下载任务完整时,将所述内存中的数据写入磁盘,包括:在所述下载任务完整时,将所述下载任务的下载模式设置为磁盘+内存的模式,所述磁盘+内存的模式下所述内存中的数据将会写入磁盘。
[0030] 其中,通过重置所述下载任务的下载模式参数设置所述下载任务的下载模式。
[0031] 一种下载资源的装置,应用于对等计算机P2P网络,包括:
[0032] 启动模块,用于根据来自资源请求方的下载请求,启动下载任务;
[0033] 获取模块,用于获取所述下载任务的数据;
[0034] 内存模块,用于将所述下载任务的数据写入内存;
[0035] 提供模块,用于从所述内存中读取所述数据并提供给所述资源请求方。
[0036] 其中,还包括:确定模块,用于在所述内存中的数据达到预先设定的使用上限时,确定所述下载任务是否完整,所述下载任务完整表示所述下载任务能够获取到完整资源;过滤模块,用于在所述下载任务不完整时,过滤所述下载任务,以便不将所述内存中的数据写入磁盘;磁盘写模块,用于在确定所述下载任务完整时,将所述内存中的数据写入磁盘。
[0037] 其中,所述确定模块,具体用于根据所述下载请求中的Range信息,确定所述下载任务是否完整。
[0038] 其中,所述确定模块,具体用于通过如下方式之一或两项确定所述下载任务是否完整:
[0039] 判断所述下载请求的Range信息是否从0开始,在所述Range信息从0开始时确定所述下载任务完整;
[0040] 根据所述下载请求中的Range信息,识别所述下载请求是否对应Seek操作,在所述下载请求对应跳转Seek操作时确定所述下载任务不完整。
[0041] 其中,所述磁盘写模块,具体用于:在所述内存中的数据达到预先设定的使用上限且所述下载任务完整时,在所述磁盘中创建文件并将所述内存中的数据写入所述文件中,或者直接打开所述下载任务对应的文件并将所述内存中的数据写入所打开的文件中。
[0042] 其中,所述磁盘写模块,具体用于:将所述内存中的数据拼成连续的数据块后写入磁盘。
[0043] 其中,所述内存模块,用于将所述下载任务的数据写入内存,包括:初始为所述下载任务分配一个或多个固定大小的内存块,并通过循环使用所述内存块将所述下载任务的数据写入内存。
[0044] 其中,所述内存模块,用于将所述下载任务的数据写入内存,包括:初始为所述下载任务分配一个或多个固定大小的内存块;将所述获取模块当前收到的数据写入所述内存块;在所述内存块写满时,释放部分或全部的所述内部块,以供所述获取模块后续收到的数据使用;如此循环,直至所述下载任务结束。
[0045] 一种下载资源的装置,包括:
[0046] 存储有计算机程序存储器
[0047] 处理器,配置为读取所述计算机程序以执行上述下载资源的方法。
[0048] 本申请包括以下优点:
[0049] 一方面,本申请将收到的数据先放到内存中,直接将内存中的数据提供给资源请求方,避免分析磁盘剩余空间、淘汰资源和创建文件等耗时环节影响返回资源的速度,可明显缩短首时间,提升用户体验;此外,将数据放到内存,还可以减少磁盘的写次数,从而减少磁盘损耗,延长磁盘的寿命;
[0050] 另一方面,本申请在内存中的数据达到预先设定的使用上限时才触发数据写入磁盘的操作(比如,创建文件的操作),进一步减少磁盘的写次数,从而减少磁盘损耗、延长磁盘的寿命;
[0051] 再一方面,本申请在内存中的数据达到预先设定的使用上限时将完整度高的数据块一次性写入磁盘,不仅减少了磁盘的写次数,而且提高了磁盘中缓存资源的完整度,提升了磁盘空间的利用率;
[0052] 又一方面,本申请在内存中的数据达到预先设定的使用上限时才触发数据写入磁盘的操作,可延迟执行分析磁盘剩余空间、淘汰资源和创建文件等耗时环节,从而明显缩短首帧时间,提升用户体验。
[0053] 当然,实施本申请的任一产品必不一定需要同时达到以上所述的所有优点。附图说明
[0054] 图1为本申请的示例性应用环境的网络架构示意图;
[0055] 图2为实施例一中下载资源的方法流程示意图;
[0056] 图3为实施例二中下载资源的装置的结构示意图;
[0057] 图4为实施例三中下载资源的装置的结构示意图;
[0058] 图5为实例1中下载资源的示例性执行流程示意图。

具体实施方式

[0059] 下面将结合附图及实施例对本申请的技术方案进行更详细的说明。
[0060] 需要说明的是,如果不冲突,本申请实施例以及实施例中的各个特征可以相互结合,均在本申请的保护范围之内。另外,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
[0061] 在一个典型的配置中,客户端或服务器的计算设备可包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存(memory)。
[0062] 内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。内存可能包括模块1,模块2,……,模块N(N为大于2的整数)。
[0063] 计算机可读介质包括永久性和非永久性、可移动和非可移动存储介质。存储介质可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM),快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
[0064] 本申请中所述的P2P节点可以为任何能够实现其功能的设备。该设备可以是PC端、OTT(Over The Top)端、Android端或其他系统端的设备。换言之,该计算设备可以为如下(但不限于此):通过互联网向用户提供各种应用服务的OTT设备、移动终端、平板电脑、移动互联网设备、可穿戴设备或其他可部署P2P程序的硬件实体或虚拟装置。
[0065] 本申请中所述的资源请求方可以为通过加速器获取资源的硬件实体或虚拟装置。资源请求方可以为(但不限于)集成有加速器的应用程序。例如,通过加速器获取视频文件的播放器等。
[0066] 本文涉及术语解释如下:
[0067] P2P:是一种在对等者(Peer)之间分配任务和工作负载的分布式应用架构,是对等计算模型在应用层形成的一种组网或网络形式。
[0068] P2P节点:P2P网络系统中的每个终端,可以称为一个P2P节点。
[0069] 加速器:是指P2P节点上运行的P2P程序,P2P程序可以是集成在应用程序里面的动态库或静态库,比如可以是集成在手机上的优酷App、PC上的IKU客户端等上的软件开发工具包(SDK,Software Development Kit)。P2P程序还可以是一个独立的可执行程序。
[0070] 下载资源的P2P节点:设置有下载资源的加速器的P2P节点。
[0071] 上传资源的P2P节点:设置有上传资源的加速器的P2P节点。
[0072] 首帧时间:从收到播放器的请求到返回第一帧视频数据的时间。
[0073] 如图1所示,为本申请技术方案的示例性应用环境架构。P2P网络包括n个(n为不小于1的整数)P2P节点,分别是:P2P节点1、P2P节点2、P2P节点3、……、P2P节点n。其中,P2P节点2作为一个上传资源的P2P节点,可以向资源服务器发布资源,以便其他P2P节点从自身下载该资源,还可以向日志服务器上报日志,以便对P2P节点2进行日常维护。P2P节点1作为下载资源的P2P节点,可以通过登录服务器进行身份认证和更新配置等处理,还可以通过向资源服务器请求资源来获取上传资源的P2P节点的节点列表。如图1所示的示例中,P2P节点1从该节点列表中选中P2P节点1来下载资源,然后,P2P节点1通过向P2P节点2请求数据并接收P2P节点2发送的数据,来完成资源的下载。图1中,连接服务器负责P2P网络中各P2P节点之间的通信连接。
[0074] 相关技术中,在P2P网络的各类终端节点中,有很多节点的存储能力比较差,比如移动端和OTT端,不但读写比较慢,存储容量小,而且读写次数也有限制,一旦写入次数过多,就会导致坏区,甚至坏卡,不但缩短了tf卡的寿命,还会影响系统的稳定性。因此,需要对写入的资源做一些筛选,对一些检测出来不完整的视频,提前过滤掉,不写到磁盘上,以减少对磁盘的损耗和这些不完整视频对磁盘空间的占用。
[0075] 另外,视频播放体验有一项非常重要的指标——首帧时间,即获取到第一帧视频数据的时间。如果,加速器在下载数据的环节过多,耗时过大就会影响视频的播放体验。而在加速器的下载环节中,计算磁盘剩余空间,淘汰资源和创建文件是相对比较耗时的,尤其是在一些性能比较差的tf卡上。因此,要提高首帧时间就要对当前的资源存储环节做些优化。
[0076] 综上所述,在存储资源的时候,需要考虑这几方面的因素,设计一个比较好的存储策略,保证本地资源的完整性,提升磁盘空间的利用率,同时也降低首帧时间。
[0077] 目前,P2P节点在下载资源之后都是直接将资源写入磁盘,一般来讲,直接将资源写入磁盘的资源存储方案是顺序存储方法,即打开文件->接收数据->写入数据->关闭文件。即:首先,在下载数据之前先向服务器(比如,资源服务器)或者CDN获取资源的文件大小。然后,根据其大小判断当前磁盘的剩余空间是否足够,若不够则需要淘汰资源,直到剩余空间足够存储。接着,在磁盘上创建资源文件,并打开文件。在收到下载数据的时候,通过打开的文件句柄将数据写入到磁盘。最后,等数据都接收完后,关闭文件。
[0078] 以上方案,从性能上来讲并不是最优的。首先,不论下载任务是否完整(即,该下载任务是否能够下载到完整资源(比如,一个完整的视频文件))都需要创建文件,如果一次播放请求刚好是最后1KB数据,也要创建整个文件,这样,不完整的视频文件就会写入磁盘,不仅对磁盘造成了损耗,而且会导致磁盘的利用率很低;其次,在整个资源的下载过程中,分析磁盘剩余空间、淘汰资源和创建文件是相对比较耗时的,特别在读写性能比较差的SD卡上,非常耗时,需要几百毫秒左右,这将会大大影响到播放视频的首帧时间。
[0079] 综上可知,相关技术至少存在如下技术问题之一或多项:1)频繁写磁盘,对磁盘造成很大损耗,以至于缩短磁盘的寿命;2)磁盘中会缓存很多不完整的资源,磁盘空间的利用率很低;3)存储资源之前需要执行分析磁盘剩余空间、淘汰资源和创建文件等比较耗时的处理过程,导致整个下载过程耗时比较长,无法及时将资源返回给播放器,从而延长了首帧时间。针对以上技术问题,本申请提出了如下技术方案,通过延迟写入磁盘,至少可取得如下效果之一:1)减少写入磁盘的次数,避免频繁写磁盘,从而有效延长磁盘的寿命;2)提高磁盘中缓存的资源的完整度,提升磁盘空间的利用率;3)延迟执行分析磁盘剩余空间、淘汰资源和创建文件等耗时环节,可明显缩短首帧时间,提升用户体验。
[0080] 下面对本申请的技术方案进行详细说明。
[0081] 实施例一
[0082] 一种下载资源的方法,应用于P2P网络,如图2所示,可包括:
[0083] 步骤201,根据来自资源请求方的下载请求,启动下载任务;
[0084] 步骤202,获取所述下载任务的数据,并将所述下载任务的数据写入内存;
[0085] 步骤203,从所述内存中读取所述数据并提供给所述资源请求方。
[0086] 本实施例中,在下载资源的过程中将收到的数据先放到内存中,直接将内存中的数据提供给资源请求方,首帧数据直接从内存中读取,避开了析磁盘剩余空间、淘汰资源和创建文件等环节的时间损耗,缩短了首帧时间,提升了用户体验;此外,将数据放到内存,还可以减少磁盘的写次数,从而减少磁盘损耗,延长磁盘的寿命。
[0087] 实际应用中,一个资源对应一个下载任务,每个资源都具有唯一的资源ID,下载任务与资源之间通过该资源ID关联。资源请求方提供的下载请求中携带资源ID,加速器可以根据该资源ID启动相应的下载任务。
[0088] 本实施例中所述的内存,不是实时的系统内存,而是指分配给下载任务的内存。不同下载任务之间是相互独立的,各下载任务之间各自管理各自的内存。为了不影响正常的应用程序的使用,会为加速器预先设定一个内存的使用上限,该内存的使用上限是以任务为单位的,即该内存的使用上限是指加速器的每个任务的调度内存的上限值。本实施例中所述的内存写满,是指一个下载任务的内存数据达到了上述内存的使用上限。比如,预先设定加速器的内存使用上限为2MB,则表示加速器的每个任务(比如,一个下载任务)都有2MB的调度内存,一个下载任务的内存写满即为该下载任务当前使用的内存已达到2MB。
[0089] 在内存的使用上,为了控制内存大小,减少内存的分配和释放,提高内存使用的效率,本实施例采用分块内存循环使用的方法将下载任务的数据写入内存。即,本实施例中,所述将所述下载任务的数据写入内存,可以包括:初始为所述下载任务分配一个或多个固定大小的内存块,并通过循环使用所述内存块将所述下载任务的数据写入内存。具体的,所述获取所述下载任务的数据,并将所述下载任务的数据写入内存,可以包括:初始为所述下载任务分配一个或多个固定大小的内存块;收到所述下载任务的数据后,将所述数据写入所述内存块;在所述内存块写满时,释放部分或全部的所述内部块,以供后续收到的数据使用;如此循环,直至所述下载任务结束。
[0090] 实际应用中,采用分块内存循环使用的方法将下载任务的数据写入内存可以包括:初始分配固定大小的内存块(Block),内存块的初始状态设置为“空闲”。当收到数据后,向“空闲”的内存块写入数据,在内存块写入数据之后将该内存块标识为“使用”。在内存块写满时,将全部或部分已写满的内存块中的数据读出并将该内存块的状态重置为“空闲”,供新收到的数据使用。如此,可通过循环使用初始分配给当前下载任务的内存块来存放当前下载任务的数据,避免频繁的为当前下载任务分配和释放内存。最后,当整个下载任务结束,内存块中的数据都被读走(比如,写入磁盘和/或输出给资源请求方),内存块即被释放,供后续使用。
[0091] 这里,如果空闲的内存块足以存放当前收到的数据,则可以直接将当前收到的数据写入所述空闲的内存块;如果所有内存块均已写满或当前空闲的内存块不足以存放当前收到的数据,则将部分或全部已写满的内存块中的释放(即,将该内存块中的数据读出,读出之后可以写入磁盘或直接返回给资源请求)并将当前收到的数据存放到所释放的内存块中。
[0092] 比如,初始分配4个内存块,每个内存块大小为1MB,当收到0-1MB,1MB-2MB,2MB-3MB,3MB-4MB的这四个数据时,分别创建内存块1,2,3,4用于存放这些数据,同时用一个bitmap的数据结构记录每个内存块里数据的使用情况。当收到第5MB数据时,发现当前下载任务的内存已经达到预先设定的使用上限,则根据bitmap中的数据,将已使用的内存块中的数据读出并写入磁盘或返回给资源请求方,将该内存块空出来,并将第5MB的数据存放到该内存块中。同理,再收到数据时,依次将已满的内存块中的数据读出(写入磁盘和/或返回给资源请求方),并将当前收到的数据放到该内存块中,同时更新对应的bitmap中记录的信息。
[0093] 本实施例中,从所述内存中读取所述数据并提供给所述资源请求方之后,释放所述数据在所述内存中占用的内存块。
[0094] 本实施例中,将所述内存中的数据写入磁盘之后,释放所述数据在内存中占用的内存块。
[0095] 本实施例中,在下载过程中,接收到的数据,并不是直接写入到磁盘上,而是放在内存中,延迟写入磁盘。在下载任务的内存写满时,触发数据写入磁盘的操作。
[0096] 一种实现方式中,所述方法还可以包括:在所述内存中的数据达到预先设定的使用上限时,确定所述下载任务是否完整,所述下载任务完整表示所述下载任务能够获取到完整资源;在所述下载任务不完整时,过滤所述下载任务,以便不将所述内存中的数据写入磁盘。
[0097] 一种实现方式中,所述方法还可以包括:在所述内存中的数据达到预先设定的使用上限时,确定所述下载任务是否完整,所述下载任务完整表示所述下载任务能够获取到完整资源;在确定所述下载任务完整时,将所述内存中的数据写入磁盘。
[0098] 本实施例的上述实现方式中,在一个下载任务的内存数据已满时,触发判断哪些下载任务是不完整的。针对不完整的下载任务,其下载的资源不完整将无法用于发布,故将这些不完整的下载任务过滤,不写入到磁盘。针对完整的下载任务,将其数据写入到磁盘。这样,通过过滤不完整的下载任务,仅将完整下载任务的数据写入磁盘,可避免磁盘空间的浪费,提高磁盘空间的利用率。
[0099] 本实施例中,可以通过设置下载任务的下载模式来实现下载任务的过滤。一种实现方式中,所述在所述下载任务不完整时,过滤所述下载任务,以便不将所述内存中的数据写入磁盘,可以包括:在所述下载任务不完整时,将所述下载任务的下载模式设置为内存模式,所述内存模式下所述内存中的数据不会写入磁盘。另一种实现方式中,所述在所述下载任务完整时,将所述内存中的数据写入磁盘,可以包括:在所述下载任务完整时,将所述下载任务的下载模式设置为磁盘+内存的模式,所述磁盘+内存的模式下所述内存中的数据将会写入磁盘。
[0100] 其中,内存模式下不会写磁盘,而“磁盘+内存”的模式下会写磁盘。实际应用中,写磁盘的主要目的是向其他的P2P节点发布资源,但是前提是该资源是完整的,如果不完整则无法判断数据的正确性,就不能用于发布。本文中的过滤掉的下载任务,主要是针对这些无法用于发布的不完整资源的下载任务。
[0101] 一种实现方式中,内存模式下,下载任务的数据落在内存块里。当内存块中的数据发送给资源请求方后,内存中的数据就被擦除掉,当整个内存块的数据被全部擦除后,内存就空闲下来留给新的数据用。
[0102] 另一种实现方式中,“磁盘+内存”的模式下,下载任务的数据先存放在内存块里。当内存块中的数据写满时,将内存块中的数据写入磁盘,并在写入磁盘之后再将内存块中的数据擦除掉。当整个内存块的数据被全部擦除后,内存就空闲下来留给新的数据用。
[0103] 本实施例中,在确定下载任务是否完整之后,可以通过重置所述下载任务的下载模式参数设置所述下载任务的下载模式。
[0104] 比如,每个下载任务可设置一个下载模式参数,下载模式参数可指示上述两种下载模式。比如,下载模式参数置为“1”时,表示下载模式设置为内存模式,下载模式参数置为“2”时,表示下载模式设置为“磁盘+内存”的模式。除此之外,还可以采用其他方式,本文不予限制。
[0105] 再比如,下载任务初始时下载模式参数可设置为“磁盘+内存”模式,当下载任务判定为不完整后,将其下载模式参数重置为内存模式,这样,在下载任务的执行过程中,收到数据后放入内存但不会将内存中的数据写到磁盘上。当下载任务判定为完整后,保持其下载模式参数的初始设置,这样,下载任务的执行过程中,“磁盘+内存”模式下收到数据后放入内存在会后还将会写入磁盘。
[0106] 需要说明的是,本实施例中下载任务的完整度是指该下载任务能获取到的资源的完整度。下载任务完整是指该下载任务能够获取到完整资源,下载任务不完整是指该下载任务不能获取到完整资源。这里,资源是指可独立下载的文件,完整资源是指该可独立下载的完整文件,即该文件的所有数据。这里,所述文件可以是任何类型的文件。比如,所述文件可以是视频文件。比如,有些视频文件比较大,在服务器上会被其切分为几个小文件,一般在几十MB左右,每个小文件可以作为一个独立的任务单位来进行下载,一个小文件即为一个资源,一个完整资源可以是一个小文件中的所有数据。
[0107] 本实施例中,确定下载任务是否完整的方式可以有多种。一种实现方式中,上述方法可以包括:根据所述下载请求中的Range信息,确定所述下载任务是否完整。
[0108] 实际应用中,可以通过解析下载请求来获取所述Range信息。比如,用户在应用程序中点击播放某个视频时,播放器会将视频源的URL地址和对应的Range信息发送给加速器,这就是加速器收到的下载请求。其次,Range信息的解析是通过标准的HTTP协议。可以在下载请求的头部(header)解析到Content-Range字段,从该Content-Range字段可提取到Range信息。
[0109] 目前,有两种情况判断出一个资源一定是不完整的:
[0110] 第一种情况:从下载请求中解析出来的Range信息,如果不是从0开始的,说明要下载的资源不是从头开始的,之后获取到的数据也是肯定不能形成完整资源的,相应的,如果下载请求中解析出来的Range信息不是从0开始则可以说明当前下载任务是不完整的。比如,顺序播放的视频,其Range信息都是从0开始的。绝大部分情况下,Range信息不是从0开始的,那么下载的资源一定是不完整的。比如,Range信息不是从0开始的有如下三种情况:A)跳转(Seek);B)跳过片头片尾;C)记录上次观看的位置,继续看等。
[0111] 第二种情况:实际应用中,在用户Seek的时候,会跳过中间一段数据,造成整个文件是不完整的。如果根据下载请求识别到文件内Seek,说明当前要下载的资源也是不完整的,相应的,如果识别到文件内Seek则说明当前下载任务是不完整的。这里,文件内Seek指的是在这种独立文件内Seek的场景。
[0112] 针对上述第一种情况,可以在下载任务启动时判断出该下载任务是否完整。第二种情况,下载任务启动到内存用满这段时间内识别Seek操作,即可视为该下载任务时不完整的。
[0113] 基于上述两种,本实施例中可以通过如下两种方式来确定下载任务是否完整:1)判断所述下载请求的Range信息是否从0开始,在所述Range信息从0开始时确定所述下载任务完整;如果所述Range信息不是从0开始时则确定所述下载任务不完整。2)根据所述下载请求中的Range信息,识别所述下载请求是否对应Seek操作,在所述下载请求对应Seek操作时确定所述下载任务不完整。在所述下载请求不是对应跳转Sseek操作时,则需要结合Range信息再确定所述下载任务是否完整。换言之,如果下载请求对应Seek操作,那么相应的下载任务肯定是不完整的,如果下载请求不是对应Seek操作的,相应的下载任务则不一定是完整的。实际应用中,下载任务的内存有几MB,将内存数据都填满,需要几秒的时间,可以识别出一些快速Seek的场景。
[0114] 具体的,所述根据所述下载请求中的Range信息,识别所述下载请求是否对应Seek操作,可以包括:根据所述下载请求的Range信息与内存中已有的相应下载任务的Range信息,判断对应所述下载请求的数据与内存中已有的相应数据是否能够拼接为完整资源;在对应所述下载请求的数据与内存中已有的相应数据能够拼接为完整资源时,判定所述下载请求不是对应Seek操作。这里,在对应所述下载请求的数据与内存中已有的相应数据不能够拼接为完整资源时,判定所述下载请求对应Seek操作。除此之外,还可通过其他方式来识别当前的下载请求是否对应Seek操作。对此,本文不予限制。
[0115] 本实施例中,将收到的数据先放到内存中延迟写入磁盘。具体的,所述将所述内存中的数据写入磁盘,可以包括:所述内存中的数据达到预先设定的使用上限且所述下载任务完整时,在所述磁盘中创建文件并将所述内存中的数据写入所述文件中,或者直接打开所述下载任务对应的文件并将所述内存中的数据写入所打开的文件中。换言之,本实施例中将内存中的数据写入磁盘时,创建文件有两个条件:一是内存写满,二是下载任务完整。这样,通过将创建文件和打开文件等磁盘的写操作延后到相应内存写满时再触发,可有效缩短首帧时间。
[0116] 本实施例中,将内存中的数据写入磁盘的过程可以是:判断是否已存在当前下载任务对应的文件(比如,可以根据下载任务的资源ID和文件的资源ID判断是否已存在对应该下载任务的文件),如果不存在与当前下载任务相对应的文件,则首先在磁盘中创建文件,然后打开该文件并通过打开的文件句柄将内存中的数据写入该文件,内存中的数据写完后关闭文件;如果存在与当前下载任务对应的文件,可以直接打开该文件并通过打开的文件句柄将内存中的数据写入该文件,等内存中的数据写完后关闭该文件。
[0117] 实际应用中,在加速器刚启动时,在启动参数中能获取到缓存的路径。当触发创建文件操作时,可以根据下载任务的资源ID,到缓存路径下查找,有没有以该资源ID命名的文件,如果有则打开文件,反之创建一个以该资源ID命名的文件。比如,资源ID是53121400C244D5B00B87A39D804438FA5FC575A3,创建的文件名称可以为
53121400C244D5B00B87A39D804438FA5FC575A步骤3.dat。
[0118] 本实施例中,所述将所述内存中的数据写入磁盘,可以包括:将所述内存中的数据拼成连续的数据块后写入磁盘。如此,将来自多个上传资源的P2P节点的零散的、碎片化的数据先存放到内存中,待拼成连续的完整的数据块后一次性写入磁盘,不仅可提高写入效率,而且可减少磁盘的写次数、提高磁盘IO的性能。
[0119] 本实施例中,所述方法还包括:所述内存中的数据达到预先设定的使用上限且所述下载任务完整时,分析所述磁盘的剩余空间;在所述磁盘的剩余空间不足以存放所述内存中的数据时,执行淘汰资源的操作,以便将所述内存中的数据写入所述磁盘。这样,可将分析磁盘空间、淘汰资源等耗时的磁盘处理环节延后到相应内存写满时再触发,将这部分时间损耗后移,避开了这些环节对首帧数据的影响。
[0120] 实施例二
[0121] 本实施例还提供一种下载资源的装置,应用于P2P网络,如图3所示,可以包括:
[0122] 启动模块31,用于根据来自资源请求方的下载请求,启动下载任务;
[0123] 获取模块32,用于获取所述下载任务的数据;
[0124] 内存模块33,用于将所述下载任务的数据写入内存;
[0125] 提供模块34,用于从所述内存中读取所述数据并提供给所述资源请求方。
[0126] 本实施例中,上述装置还可以包括:
[0127] 确定模块35,用于在所述内存中的数据达到预先设定的使用上限时,确定所述下载任务是否完整,所述下载任务完整表示所述下载任务能够获取到完整资源;
[0128] 过滤模块36,用于在所述下载任务不完整时,过滤所述下载任务,以便不将所述内存中的数据写入磁盘;
[0129] 磁盘写模块37,用于在确定所述下载任务完整时,将所述内存中的数据写入磁盘。
[0130] 一种实现方式中,所述确定模块35,具体可用于根据所述下载请求中的Range信息,确定所述下载任务是否完整。
[0131] 一种实现方式中,所述确定模块35,具体可用于通过如下方式之一或两项确定所述下载任务是否完整:1)判断所述下载请求的Range信息是否从0开始,在所述Range信息从0开始时确定所述下载任务完整;2)根据所述下载请求中的Range信息,识别所述下载请求是否对应Seek操作,在所述下载请求对应跳转Seek操作时确定所述下载任务不完整。
[0132] 一种实现方式中,所述磁盘写模块37,具体可用于:在所述内存中的数据达到预先设定的使用上限且所述下载任务完整时,在所述磁盘中创建文件并将所述内存中的数据写入所述文件中,或者直接打开所述下载任务对应的文件并将所述内存中的数据写入所打开的文件中。
[0133] 一种实现方式中,所述磁盘写模块37,具体可用于:将所述内存中的数据拼成连续的数据块后写入磁盘。
[0134] 一种实现方式中,所述内存模块33可用于将所述下载任务的数据写入内存,包括:初始为所述下载任务分配一个或多个固定大小的内存块,并通过循环使用所述内存块将所述下载任务的数据写入内存。
[0135] 一种实现方式中,内存模块33可用于将所述下载任务的数据写入内存,包括:初始为所述下载任务分配一个或多个固定大小的内存块;将所述获取模块当前收到的数据写入所述内存块;在所述内存块写满时,释放部分或全部的所述内部块,以供所述获取模块后续收到的数据使用;如此循环,直至所述下载任务结束。
[0136] 实际应用中,本实施例的上述装置可设置于P2P节点或实现为P2P节点。
[0137] 需要说明的是,本实施例的上述装置中:
[0138] 启动模块31,负责管理下载任务,可以根据下载请求中携带的资源ID启动相应的下载任务,实际应用中可以是软件、硬件或两者的结合。
[0139] 获取模块32,负责从上传资源的P2P节点获取已启动的下载任务的数据,可以根据下载任务的资源ID获取相应资源的数据,实际应用中可以是软件、硬件或两者的结合。
[0140] 内存模块33,负责管理各下载任务的内存,包括:向下载任务分配内存,以及将下载任务的数据写入对应的内存,实际应用中可以是软件、硬件或两者的结合。
[0141] 提供模块34,负责将数据提供给资源请求方,可以从内存中读取数据并将该数据发送给资源请求方,实际应用中可以是软件、硬件或两者的结合。
[0142] 确定模块35,负责判定下载任务是否完整,即该下载任务是否能够获取到完整资源,实际应用中可以是软件、硬件或两者的结合。
[0143] 过滤模块36,负责将不完整的下载任务过滤,以便不将这些下载任务的数据写入磁盘,实际应用中可以是软件、硬件或两者的结合。
[0144] 磁盘写模块37,负责将完整的下载任务的数据写入磁盘,实际应用中可以是软件、硬件或两者的结合。
[0145] 实施例三
[0146] 一种下载资源的装置,应用于P2P网络,如图4所示,可以包括:
[0147] 存储有计算机程序的存储器41;
[0148] 处理器42,配置为读取所述计算机程序以执行实施例一所述下载资源的方法的操作。
[0149] 上述下载资源的装置还可以包括:内存43。处理器42配置为读取所述计算机程序以实现如下操作:将下载任务的数据写入所述内存43中。
[0150] 上述下载资源的装置还可以包括:磁盘44。处理器42配置为读取所述计算机程序以实现如下操作:在所述内存中的数据达到预先设定的使用上限时,确定所述下载任务是否完整,所述下载任务完整表示所述下载任务能够获取到完整资源;在确定所述下载任务完整时,将所述内存43中的数据写入磁盘44。
[0151] 需要说明的是,图4所示下载资源的装置除包含上述的存储器41、处理器42、内存43、磁盘44之外,还可以包含其他部件。比如,还可以包含用于存储用户数据的数据存储器;
再比如,还可以包含用于与外部设备进行通信的通信电路;再比如,还可以包含用于将各部分耦合连接的总线。又比如,还可以包括输入部件、输出部件(如,麦克、喇叭、显示器、键盘等)。除此之外,上述装置还可以包含其他部件。
[0152] 实施例四
[0153] 本实施例还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现上述下载资源的方法的步骤。
[0154] 本实施例的其他技术细节可参照实施例一。
[0155] 下面对上述各实施例的示例性实现方式进行详细说明。需要说明的是,下文各实例可相互结合。并且,下文实例中各流程、执行过程等也可以根据实际应用的需要进行调整。此外,在实际应用中,上述各实施例还可以有其他的实现方式。
[0156] 实例1
[0157] 本实例中,对资源下载过程中的示例性执行流程进行详细说明。
[0158] 如图5所示,资源下载过程中的示例性执行流程可以包括:
[0159] 步骤501,启动下载任务;
[0160] 步骤502,接收数据;
[0161] 步骤503,是否有内存?如果是,则继续504,否则继续步骤513;
[0162] 步骤504,判断内存是否已写满,如果内存已写满则继续步骤505,如果内存未写满,则继续步骤514;
[0163] 步骤505,验证下载任务是否完整,即验证下载任务是否能够获取到完整的资源文件,如果下载任务完整,则继续步骤506,如果下载任务不完整,即该下载任务不能获取到完整的资源文件,则继续步骤512;
[0164] 步骤506,验证是否已经创建文件,如果已经创建文件则继续511,如果未创建文件则继续步骤507;
[0165] 步骤507,计算磁盘剩余空间;
[0166] 步骤508,判断磁盘的剩余空间是否足够存放上述资源文件,如果磁盘剩余空间足够存放上述资源文件,则继续510;如果磁盘剩余空间不够存放上述资源文件,则继续509;
[0167] 步骤509,淘汰资源,以是的磁盘剩余空间足够存放当前下载的上述资源文件;
[0168] 步骤510,在磁盘上创建文件;
[0169] 步骤511,将内存中的数据写入磁盘,继续步骤514;
[0170] 具体的,打开已创建的文件,通过打开的文件句柄将内存中的数据写入磁盘。等数据写完后,关闭文件。
[0171] 步骤512,淘汰内存中已经读取过的数据,跳转至步骤514;
[0172] 步骤513,创建内存;
[0173] 步骤514,将接收到的数据写入内存;
[0174] 步骤515,判断文件是否下载完成,如果文件已下载完成则继续516,如果文件未下载完成则返回步骤502;
[0175] 步骤516,结束下载。
[0176] 实例2
[0177] 本实例中,对整个P2P系统中P2P节点下载资源的过程进行详细说明。
[0178] 整个P2P系统中,与资源下载相关的各P2P节点之间的交互过程如下:
[0179] 阶段1、启动该资源下载任务,包括如下步骤:
[0180] 步骤1.1,下载资源的P2P节点收到应用程序发过来的、播放视频的HTTP请求。
[0181] 步骤1.2,下载资源的P2P节点从应用程序发过来HTPP请求中,解析出URL。
[0182] 步骤1.3,下载资源的P2P节点判断应用程序发过来HTPP请求中解析出的URL,是否符合加速条件。若不符合,则直接从CDN请求,反之,继续往下执行。
[0183] 步骤1.4,下载资源的P2P节点从来自应用程序的HTPP请求中解析的URL中提取出特征信息。
[0184] 步骤1.5,下载资源的P2P节点对来自应用程序的HTPP请求中解析出的URL中提取出来的特征信息做MD5运算,生成一个MD5值。在MD5值的基础上,加入一些辅助信息,拼接成一个40个字符的资源ID值。
[0185] 步骤1.6,下载资源的P2P节点启动该资源的下载任务。
[0186] 阶段2、下载资源的P2P节点从服务器(比如,资源服务器)获取资源信息,包括如下步骤:
[0187] 步骤2.1,下载资源的P2P节点向服务器请求资源信息,该请求中包括该资源的资源ID信息。
[0188] 步骤2.2,服务器接收下载资源的P2P节点发送过来的请求。
[0189] 步骤2.3,服务器解析来自下载资源的P2P节点的请求,得到资源ID。
[0190] 步骤2.4,服务器根据步骤2.3解析得到的资源ID,从本地内存中存储的资源列表中,查询对应的资源。若没有查询到,则返回加速信息为空的通知消息给下载资源的P2P节点,此流程结束;若查到了资源信息,则继续执行下一步。
[0191] 步骤2.5,服务器将步骤2.4查到的资源信息打包发送给下载资源的P2P节点,该资源信息可以包括:资源ID、资源大小、整个资源的MD5值、分块校验信息的MD5值、节点列表等。
[0192] 步骤2.6,下载资源的P2P节点接收服务器返回的资源信息包。
[0193] 步骤2.7,下载资源的P2P节点解析来自服务器的资源信息包,得到资源信息。
[0194] 步骤2.8,下载资源的P2P节点将步骤2.7解析出来的资源信息,存储到本地内存中。
[0195] 阶段3、从上传资源的P2P节点下载分块校验信息,可以包括如下步骤:
[0196] 步骤3.1,下载资源的P2P节点从本地内存中存储的资源信息中的节点列表中取出一个上传资源的P2P节点的节点信息,该节点信息可以包括:节点的公网地址、节点的公网端口、节点的Relay地址、节点的Relay端口、节点的地址类型等。
[0197] 步骤3.2,下载资源的P2P节点向步骤3.1取出的上传资源的P2P节点,发起连接请求。
[0198] 步骤3.3,下载资源的P2P节点和步骤3.1取出的上传资源的P2P节点,建立网络连接。
[0199] 步骤3.4,下载资源的P2P节点向步骤3.3已建立连接的上传资源的P2P节点,发送请求,请求分块校验信息,该请求中包含的信息可以包括:资源ID、分块校验信息的MD5值、分块校验信息的大小等。
[0200] 步骤3.5,上传资源的P2P节点收到下载资源的P2P节点发送过来的分块校验信息的请求。
[0201] 步骤3.6,上传资源的P2P节点从步骤3.5收到的请求中,解析出资源ID、分块校验信息的MD5值、分块校验信息的大小等。
[0202] 步骤3.7,上传资源的P2P节点根据资源ID从本地内存中存储的资源列表中,查找该资源是否存在。若没有查找到,则返回表示没有该资源的通知消息给下载资源的P2P节点,以通知下载资源的P2P节点没有该资源,当前流程可以结束。反之,继续往下执行步骤3.8。
[0203] 步骤3.8,上传资源的P2P节点根据步骤3.7从本地资源列表中查找到的、对应步骤3.6解析出来的资源ID的资源信息,该资源信息可以包括资源ID、资源大小、整个资源的MD5值、分块校验信息的MD5值、文件存储的路径等。
[0204] 步骤3.9,上传资源的P2P节点,将步骤3.8查找到的分块校验信息的MD5值和步骤3.6解析得到的分块校验信息的MD5值做比较,判断是否一致。若不一致,则返回表示文件不一致的通知消息给下载资源的P2P节点,以通知下载资源的P2P节点,当前流程可以结束,也可以返回步骤3.1重新执行。反之,继续往下执行。
[0205] 步骤3.10,上传资源的P2P节点根据步骤3.8查到的文件存储路径打开文件。
[0206] 步骤3.11,上传资源的P2P节点,根据步骤3.10打开的文件,读取分块校验信息。
[0207] 步骤3.12,上传资源的P2P节点将步骤3.11读到的分块校验信息打包返回给下载资源的P2P节点。
[0208] 步骤3.13,下载资源的P2P节点,接收来自上传资源的P2P节点的分块校验信息包。
[0209] 步骤3.14,下载资源的P2P节点,解析步骤3.13接收到的分块校验信息包,得到分块校验信息,并存储到本地内存中。
[0210] 阶段4、从上传资源的P2P节点下载数据,可以包括如下步骤:
[0211] 步骤4.1,下载资源的P2P节点将整个资源文件分解成一个个小的P2P任务(即下载任务),形成一个P2P任务池,存放在内存中。
[0212] 步骤4.2,下载资源的P2P节点从本地内存中存储的资源信息中的节点列表中取出一个上传资源的P2P节点。
[0213] 步骤4.3,下载资源的P2P节点向步骤4.2取出的上传资源的P2P节点,发送P2P任务,该P2P任务的任务信息可以包括资源ID、整个资源的MD5值、文件的起始位置、数据块的大小等。
[0214] 步骤4.4,上传资源的P2P节点收到下载资源的P2P节点发送过来的P2P任务,解析得到任务信息:资源ID,整个资源的MD5值,数据块的起始位置,数据块的大小等。
[0215] 步骤4.5,上传资源的P2P节点根据步骤4.4解析得到的资源ID,从本地存储的资源列表中,查找对应的资源。若找不到,则返回表示没有该资源的通知消息给下载资源的P2P节点。反之,继续往下执行步骤4.6。
[0216] 步骤4.6上传资源的P2P节点查找到的本地的资源信息,该资源信息可以包括:资源ID,资源大小,整个资源的MD5值,分块校验信息的MD5值,文件存储的路径等。
[0217] 步骤4.7,上传资源的P2P节点,将步骤4.6查找到的整个资源的MD5值,和步骤4.4解析得到的整个文件的MD5值做比较。若不一致,则返回表示文件不一致的通知消息给下载资源的P2P节点。反之,则继续往下执行。
[0218] 步骤4.8,上传资源的P2P节点根据步骤4.6查找到的文件存储路径,打开文件。
[0219] 步骤4.9,上传资源的P2P节点根据步骤4.4解析出来的数据块的起始位置和数据块的大小,计算出需要做校验的分块数据。
[0220] 比如,起始位置是8KB,数据块大小是9KB,则对应的Range为[8KB,17KB)。若分块校验的分块大小是10KB,则请求的数据块,落在[0KB,10KB)和[10KB,20KB)两个分块中。
[0221] 步骤4.10,上传资源的P2P节点从步骤4.8打开的文件中读取出步骤4.9计算出来的需要做校验的分块数据。
[0222] 步骤4.11,上传资源的P2P节点对步骤4.10读取出来的分块数据,计算每个分块数据的MD5值。
[0223] 步骤4.12,上传资源的P2P节点从步骤4.8打开的文件中,读取分块校验信息。
[0224] 步骤4.13,上传资源的P2P节点从步骤4.12的分块校验信息中,提取步骤4.9需要做校验的分块数据的MD5值。
[0225] 步骤4.14,上传资源的P2P节点将步骤4.11计算出来的MD5值和步骤4.13提取出来的MD5值做比较,若不一致,则返回表示数据错误的通知消息给下载资源的P2P节点。反之,继续往下执行。
[0226] 步骤4.15,上传资源的P2P节点从校验成功的分块数据中,读取步骤4.4解析出来的数据块。如从[0KB,10KB)和[10KB,20KB)两个分块中,取出[8KB,17KB)的数据块。
[0227] 步骤4.16,上传资源的P2P节点将步骤4.15取出的数据,返回给下载资源的P2P节点。
[0228] 步骤4.17,下载资源的P2P节点接收上传资源的P2P节点发送过来的数据,存放到本地内存中或写入到磁盘文件中。
[0229] 阶段5、将数据写入磁盘,包括如下步骤:
[0230] 步骤5.1,下载资源的P2P节点,在启动下载任务之后,在指定的磁盘目录下,创建资源文件,文件名即资源ID。同时,将文件存储路径记录到内存中。
[0231] 步骤5.2,下载资源的P2P节点打开资源文件。
[0232] 步骤5.3,下载资源的P2P节点将本地内存中存储的资源信息中的分块校验信息写入步骤5.2打开的文件中。
[0233] 步骤5.4,下载资源的P2P节点重复阶段4,接收数据。
[0234] 步骤5.5,当一个分块的数据接收完成,比如第0个分块,[0KB,10KB)的数据接收完成,下载资源的P2P节点就可计算当前分块的MD5值。
[0235] 步骤5.6,下载资源的P2P节点,根据分块的序号,从步骤5.3中的分块校验信息中,提取对应的MD5值。比如,分块校验信息中,第0个分块的MD5值,是AAAAAAAAAAAAAAAA。
[0236] 步骤5.7,下载资源的P2P节点将步骤5.5计算得到的MD5值,和步骤5.6提取出来的MD5值,做比较。若MD5值一致,则说明数据是正确的,反之数据有误,需要删除重新下载。
[0237] 步骤5.8,下载资源的P2P节点,将步骤5.7校验正确的数据,写入步骤5.2打开的文件中。
[0238] 本领域普通技术人员可以理解上述方法中的全部或部分步骤可通过程序来指令相关硬件完成,所述程序可以存储于计算机可读存储介质中,如只读存储器、磁盘或光盘等。可选地,上述实施例的全部或部分步骤也可以使用一个或多个集成电路来实现。相应地,上述实施例中的各模块/单元可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。本申请不限制于任何特定形式的硬件和软件的结合。
[0239] 当然,本申请还可有其他多种实施例,在不背离本申请精神及其实质的情况下,熟悉本领域的技术人员当可根据本申请作出各种相应的改变和变形,但这些相应的改变和变形都应属于本申请的权利要求的保护范围。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈