【发明内容】
本发明的目的是提供一种读取分段压缩包中数据的方法,其解决了读取数据过程中存在的读取时间过长和内存空间占用过多的问题。
上述技术问题通过以下技术方案实现:
一种读取分段压缩包中数据的方法,在所述分段压缩包中,所有文件以分段方式压缩;其特征在于,读取过程先后包括加载步骤和读取步骤;
加载步骤中,接收上层应用传入受访文件的标识信息,并为受访文件分配虚拟地址空间;
读取步骤中,接收上层应用传入受访文件的标识信息与受访区间信息,之后解压与受访区间对应的压缩段,并将解压后的数据经由虚拟地址空间返回给上层应用。
由上述方案,通过本发明的方法,在加载过程无需要为受访一次性分配足量的物理内存,也无需将其完全解压到物理内存中,读取过程只针对被访问的压缩段进行解压;因此,本发明在读取分段压缩包中数据的过程中减少了解压文件的时间及降低了物理内存的占用,从而提供了读取数据的速度。
进一步的方案是:在所述分段压缩包中,每个文件被分成若干个数据段分别进行压缩,每个数据段压缩后称之为一个压缩段,分段压缩包内存储了每个文件的所有压缩段。
进一步的方案是:在所述分段压缩包中存有一份分段压缩映射表,分段压缩映射表记录着每个数据段在文件的位置信息、每个压缩段在分段压缩包内的位置信息、数据段与压缩段的位置对应关系;所述的位置信息包括偏移值和大小。
进一步的方案是:所述的加载过程,会先从分段压缩包中获取受访文件的每个数据段的位置信息(由此可以得知受访文件解压后的大小),并为此文件分配虚拟地址空间,虚拟地址空间连续,且其大小等于或大于受访文件解压后的大小,在该虚拟地址空间中,文件的每个段数据都有一一对应并大小相等的部分虚拟地址空间。
所述读取步骤具体包括:
(301)接收上层应用根据所需的数据传入受访文件的标识信息及受访区间的信息,先查询与受访区间对应的虚拟地空间是否已经分配了物理内存,若是则直接跳转至步骤(305);
(302)由受访文件的受访区间的信息,在分段压缩映射表中进行查询,确定出与所需数据段对应的压缩段,以及这些压缩段在分段压缩包内的位置;
(303)为上一步骤中查找得到的压缩段分配相应的物理内存,每一个压缩段对应的物理内存称之为段空间,物理内存中所需分配的段空间的大小大于或等于其对应的压缩段经解压后的大小;
(304)将每一个查询得到的压缩段解压到相应的段空间中;然后,将物理内存中的上述段空间与所述与受访区间对应的虚拟地空间建立起映射关系,因此,对虚拟地址空间的读写操作将反映到物理内存上;
(305)将虚拟地址空间中指向受访数据的指针返回给上层应用。
【具体实施方式】
一种读取分段压缩包中数据的方法,在所述分段压缩包中,在所述分段压缩包中,所有文件以分段方式压缩;在所述分段压缩包中存有一份分段压缩映射表,分段压缩映射表记录着每个数据段在文件的位置信息、每个压缩段在分段压缩包内的位置信息、数据段与压缩段的对应关系,位置信息包括偏移值和大小,因此,分段压缩映射表也反映出每个文件的未经压缩的大小、压缩后的大小、每个数据段的大小和每个压缩段的大小;
所述方法先后包括加载步骤和读取步骤;
加载步骤具体包括:
(201)调用文件打开函数打开分段压缩包;
(202)接收上层应用传入受访文件的文件标识(例如,文件名称),先从分段压缩包中获取受访文件的每个数据段的位置信息,由此可以得知受访文件解压后的大小,然后为受访文件分配一个连续的虚拟地址空间,此虚拟地址空间的起始地址记为pBase,分配空间的大小等于或大于受访文件解压后的大小;在该虚拟地址空间中,文件的每个段数据都有一一对应并大小相等的部分虚拟地址空间;
如图1所示,读取步骤:
(301)接收上层应用根据所需要的数据传入受访文件的标识信息及受访区间的信息(在实际应用中,具体为:受访文件的文件标识(例如,文件名称)、偏移值offset、长度length);先调用API函数查询虚拟地址空间中的与受访区间对应的虚拟地址空间(即虚拟地址空间中的[pBase+offset,pBase+offset+length])是否已经分配了物理内存;若是则直接跳转至步骤(305);
(302)在分段压缩映射表中进行查询,确定出与所需数据段对应的压缩段,以及这些压缩段在分段压缩包内的位置;具体是,由文件标识确定受访文件,再由偏移值offset和长度length确定出所需要的数据在受访文件的具体位置,由于分段压缩映射表记录着每个数据段在文件的位置信息,然后可以在分段压缩映射表中查询到出对应的数据段,根据数据段与压缩段的对应关系,确定出与所需数据对应的压缩段,并从分段压缩映射表中查询出这些压缩段在分段压缩包内的位置;
(303)为上一步骤中查找得到的压缩段分配相应的物理内存,每一个压缩段对应的物理内存称之为段空间,物理内存中所需分配的段空间的大小大于或等于其对应的压缩段经解压后的大小;
(304)将每一个查询得到的压缩段解压到相应的段空间中;然后,调用API函数将物理内存中的上述段空间与所述与受访区间对应的虚拟地空间建立起映射关系,因此,对虚拟地址空间的读写操作将反映到物理内存上,在受访文件的访问过程中,始终保持着已建立的映射关系;
(305)将虚拟地址空间中指向受访数据的指针返回给上层应用。
上层应用获取该指针后,可以在访问文件的同一个访问周期内多次使用数据指针来获取所需的数据;当接收到上层应用发送回的指针,然后根据指针找到虚拟地址空间的相应位置,再根据虚拟地址空间与内存的映射关系从内存中找出所需的数据;即,上层应用对虚拟地址空间的所有读取操作都将在对应的物理内存中完成。
在访问受访文件过程中,受访文件中没有被访问到的数据段,是不需要从压缩包将对应的压缩段进行解压和分配内存,可见,在对访问压缩包的过程中,提高了读取速度和减少占用内存空间。
使用了虚拟地址空间,可以在访问受访文件过程中,始终记录着虚拟地址空间中已存在对应关系的物理内存的区间,避免了虚拟地址空间的区间被重复建立对应关系的物理内存。
当上层应用访问受访文件结束后,则将虚拟地址空间对应的句柄或引用销毁,并回收所使用的地址空间和物理内存。
下面以一具体应用来描述上述方法的运用:
例如,一游戏应用程序需要经常运用两个文件A、B,文件A、B的大小分别为13MB和16MB;文件A、B被压缩在一分段压缩包C中,在分段压缩包C中,文件A依序被分成三个数据段(前两个数据段的大小为5MB,第三个数据段的大小为3MB)进行压缩,分别得到第一A压缩段、第二A压缩段和第三A压缩段,这三个压缩段的大小分别为3MB、2MB、1MB;文件B依序被分成个数据段(前三个数据段的大小为5MB,第四数据段的大小为1MB)进行压缩,分别得到第一B压缩段、第二B压缩段、第三B压缩段和第四B压缩段,这四个压缩段的大小分别为2MB、2.2MB、3MB、0.4MB;同时,分段压缩包C存有一分段映射表,该分段压缩映射表记录着每个数据段在文件的位置信息、压缩段在分段压缩包内的位置信息及数据段与压缩段的对应关系,位置信息包括偏移值和大小,因此,分段压缩映射表也反映出每个文件的未经压缩的大小、压缩后的大小、每个数据段的大小和每个压缩段的大小。
读取上述分段压缩包的方法,先后包括加载步骤和读取步骤;
加载步骤具体包括:
(201)调用文件打开函数打开分段压缩包C;
(202)接收上层应用传入文件A的文件标识(例如,文件名称),为文件A分配一个连续的虚拟地址空间,此虚拟地址空间的起始地址记为pBase,分配空间的大小为该文件A未经压缩的大小;
读取步骤具体包括:
(301)接收上层应用根据所需要的数据传入文件A的信息,具体为:受访文件的文件标识(例如,文件名称)、偏移值offset、长度length,假设偏移值为4MB,长度为4MB;先调用API函数查询虚拟地址空间中的与受访区间对应的虚拟地址空间(即虚拟地址空间中的[pBase+offset,pBase+offset+length])是否分配了物理内存;若是则直接跳转至步骤(304);
(302)由文件A的受访区间的信息,在分段压缩映射表中进行查询来确定与所需数据对应的压缩段,以及这些压缩段在分段压缩包内的位置;具体是:由偏移值offset和长度length确定出所需要的数据在受访文件的具体位置:文件A的第4MB至第8MB;因此,可以确定出要找的数据在文件A的第一个段数和第二个数据段,从而确定出要找的数据在分段压缩包中的第一A压缩段和第二A压缩段,并从分段压缩映射表中查询出第一A压缩段和第二A压缩段在分段压缩包内的位置;
(303)在物理内存中分配与第一A压缩段、第二A压缩段分别对应的第一段空间和第二段空间,第一段空间和第二段空间的大小分别为5MB、5MB;
(304)将第一A压缩段和第二A压缩段一一对应地解压到两个段空间中;后,调用操作系统的API函数将物理内存中的第一A压缩段、第二A压缩段分别与即虚拟地址空间中的[pBase,pBase+5M]、[pBase+5M,pBase+10M]建立起映射关系,即虚拟地址空间中的[pBase,pBase+5M]及[pBase+5M,pBase+10M]已经分配了物理内存;
(305)虚拟地址空间中指向受访数据的指针(即该指针指向虚拟地址空间中的[pBase+offset,pBase+offset+length])返回给上层应用。
本发明不局限于上述实施例,基于上述实施例的、未做出创造性劳动的简单替换,应当属于本发明揭露的范围。