一种对比打包文件的方法,装置及其系统
技术领域
本发明涉及一种对比打包文件的方法,特别是一种能对比打包文件的装置以及系统。
背景技术
在大型客户端中所保存的资源文件通常是以压缩包的形式存在。现有的对比打包文件方法在对比两个压缩包中的文件内容是否完全一致时需要如下的三步处理过程:
第一步,将第一个压缩包内的所有文件内容解压缩到硬盘上;
第二步,再将第二个压缩包内的所有文件内容解压缩到硬盘上;
第三步,对比两份解压缩后的相对应文件,确认所述两份文件内容是否相同。
但所述这种现有的处理方式有如下四个重要的缺点:
缺点1,由于所述现有处理过程的第一步和第二步中的解压缩处理需要进行硬盘的读写操作,因此处理速度相对变得非常缓慢,特别是当压缩包越大,所需要的读写时间就越长;
缺点2,由于所述现有处理过程第三步的对比过程均为单一线程,如在文件读取过程中无法同时进行解压缩处理,而在进行解压缩处理过程中又无法同时进行对比文件的处理;
缺点3,在执行完所有处理过程并输出对比结果后还需要将前两步解压到硬盘上的文件内容进行清理,从而减少对硬盘空间的占用,但同时该过程也需要一定的时间来进行硬盘的写操作;
缺点4,现有的方法在进行文件读取过程中,由于没有考虑压缩包内文件在压缩包里面的地址顺序,而根据硬盘的机械特性,硬盘磁头在高地址与低地址之间反复跳动寻址,将影响文件读取的效率。因此现有的不根据地址顺序的读取会降低硬盘的读取效率。
因此所述的现有的对比打包文件方法的效率非常低,当打包文件越大,其所需的时间也越长。
发明内容
为了解决现有技术中所存在的上述问题,本发明的目的是提供一种高效的对比打包文件的方法,及其对应该算法的对比打包文件的装置。
本发明解决其技术问题所采用的技术方案是:
一种对比打包文件的方法,包括两条独立的流水线,每条流水线内包括5个独立的线程,5个独立的任务队列和一个差异结果集合。整个方法的进程里面有10个独立线程,10个任务队列和两个差异结果集。
进一步,每个线程独立完成自己的工作,即每次从自己的任务队列中取出一个任务来完成,之后放入下一个任务队列中。由于线程是可以独立使用CPU内核进行工作的,因此所有的线程不会阻塞,CPU达到最高的运转效率。且线程和线程间不会产生较为复杂的影响。
进一步,每条流水线中的独立线程分别为:文件名比较线程,文件校验值比较线程,文件读取线程,文件解压线程,文件内容比较线程。且此5个线程并行工作。
进一步,其每条流水线中的独立队列为:文件名比较队列,文件校验值比较队列,文件读取队列,文件解压队列,文件内容比较队列。
进一步,用于对比的包文件中,存储了每一个包内的文件名所对应的包内文件地址和校验值。
进一步,校验值可选用CRC。
进一步,差异结果集合中存储了内容上有差异的文件。即文件对比的输出结果。
进一步,两条流水线在程序启动时同时运行,其每条流水线对文件的操作过程是:
1)查询每一个包内文件名对应的包内地址;
2)根据文件在包内的地址由低到高排序;
3)将排序的文件名存入文件名对比队列中;
4)运行:文件名比较线程,文件校验值比较线程,文件读取线程,文件解压线程和文件内容比较线程;
5)从差异结果集合中取出所有文件名,并输出。
进一步,“文件名比较线程”工作过程如下:
1)取出本流水线“文件名比较队列”中的一个文件;
2)在另一条流水线的“文件名比较队列”中查找此文件名;
3)若能找到,则将此文件放入本流水线的“文件校验值对比队列”,并将其从本流水线的“文件名比较队列”中删除。若不能找到则将其存入“差异结果集合”中;
4)返回步骤1),以便取下一个文件。
进一步,“文件校验值对比线程”工作过程如下:
1)取出本流水线“文件校验值对比队列”中的一个文件;
2)在另一条流水线的“文件校验值对比队列”中查找此文件名;
3)若能找到,跳转到步骤4)。若没有找到,则不做任何处理,跳转到步骤5);
4)对比两个文件的校验值值。若此时两个文件的校验值不同则将其存入“差异结果集合”中。则若此时两个文件的校验值值相同,则将此文件放入本流水线的“文件读取队列”,并将其从本流水线的“文件校验值对比队列”中删除;
5)返回步骤1),以便取下一个文件。
进一步,“文件读取线程”工作过程如下:
1)取出本流水线“文件读取队列”中的一个文件;
2)将文件内容读取到内存中;
3)将此文件放入本流水线的“文件解压队列”,并将其从本流水线的“文件读取队列”中删除;
4)返回步骤1,以便取下一个文件。
进一步,“文件解压线程”工作过程如下:
1)取出本流水线“文件解压队列”中的一个文件;
2)将文件内容在内存中解压;
3)将此文件放入本流水线的“文件内容比较队列”,并将其从本流水线的“文件解压队列”中删除;
4)返回步骤1,以便取下一个文件。
进一步,“文件内容比较线程”工作过程如下:
1)取出本流水线“文件内容比较队列”中的一个文件;
2)在另一条流水线的“文件内容比较队列”中查找此文件名;
3)若能找到,则转到步骤4。若没有找到,则不做任何处理,跳转到步骤5;
4)比较文件内容,若此时两个文件内容不同,则将其存入“差异结果集合”中。则若此时两个文件的内容相同,将其从本流水线的“文件内容比较队列”中删除;
5)返回步骤1,以便取下一个文件。
进一步,文件名比较线程工作过程如下:当所有队列为空时,则表明所有文件已经比较完成。此时输出“差异结果集合”中的文件,此集合中的文件即为所求。
进一步,用于此方法的设备或系统有两个独立的硬盘,每个硬盘上存储一份需要对比的打包文件,且每个流水线对应一个硬盘。
进一步,两个独立硬盘可以是通过网络映射或类似的方法与设备或系统进行连接。
进一步,用于此方法的设备或系统,包括处理器用于数据的计算处理,输入部用于输入处理,输出部用于输出结果,主存储部用于存储对比方法所需要的程序指令代码,辅存储部用于文件队列的存储以及存储解压缩时所产生的临时文件,外部存储部用于存储打包文件的数据,差异结果集合中存储了内容上有差异的文件。
进一步,所述主存储部包括流水线流程控制以及两条相互独立的流水线流程。
进一步,所述流水线流程控制中包括:流水线进程管理部用于管理协调和调度所述的两条相互独立的流水线流程,线程管理部用于管理调度流水线流程,文件名比较处理部对应文件名比较,文件校验值比较处理部对应文件校验值比较,文件内容比较处理部对应文件内容比较。
进一步,所述辅存储部用于存储对应所述两条相互独立流水线流程所需的文件名比较队列,文件校验值比较队列,文件读取队列,文件解压队列,文件内容比较队列。
本发明的有益效果是:两个包对应的两个流水线并行工作,10个线程负责文件比较的各个阶段并且能并行工作,且无需对包内文件依次解压到硬盘上。相对于传统的比较方式,有较快的比较速度。特别是通过两个独立的硬盘分别存储要对比的打包文件,两个流水线分别对应一个硬盘上的打包文件,能极大的提高效率,缩短时间。
附图说明
下面结合附图和实施例对本发明作进一步说明。
图1是本发明所提打包文件对比方法的两条流水线工作示意图;
图2是本发明所提打包文件对比装置即系统的框架图;
图3是流水线处理流程图;
图4是文件名比较线程处理流程图;
图5是文件校验值比较线程处理流程图;
图6是文件读取线程处理流程图;
图7是文件解压线程处理流程图;
图8是文件内容比较线程处理流程图;
图中1处理器,2输入部,3输出部,4主存储部,5辅存储部,20外部存储部,21存储A,22存储B,30输出:差异结果集合,
110流水线流程控制,120流水线流程A,130流水线流程B,
210打包文件A,220打包文件B,
310文件名差异结果集合,320文件校验值差异结果集合, 330,文件内容差异结果集合,
C130文件名比较,C140文件校验值比较,C150文件内容比较,
S10流水线开始, S20查询每一个包内文件名对应的包内地址, S30根据文件在包内地址由低到高进行排序, S40将排序的文件名存入“文件对比队列”中, S50运行文件名比较线程,文件校验值比较线程,文件解压线程,文件比较线程, S60所有线程中的队列为空?S70等待线程运行一段时间,S80将对比结果输出到对应的差异结果集合中,S90流水线结束,
S110流水线进程管理部,S120线程管理部A.,S130线程管理部B,S140文件名比较处理部,S150文件校验值比较处理部,S160文件内容比较处理部,
S210文件名比较线程A,S220文件校验值比较线程A,S230文件读取线程A,S240文件解压线程A,S250文件内容比较线程A,
D210文件名比较队列A,D220文件校验值比较队列A,D230文件读取队列A,D240文件解压队列A,D250文件内容比较队列A,
S310文件名比较线程B,S320文件校验值比较线程B,S330文件读取线程B,S340文件解压线程B,S350文件内容比较线程B,
D310文件名比较队列B,D320文件校验值比较队列B,D330文件读取队列B,D340文件解压队列B,D350文件内容比较队列B,
Step110线程开始, Step120取出本流水线“文件名比较队列”中的一个文件,Step130能否在另一条流水线的“文件名比较队列”中查找到此文件名? Step140将此文件放入本流水线的“文件校验值对比队列”, Step150将此文件从本流水线的“文件名比较队列”中删除, Step160将其存入“文件名差异结果集合”,Step170所有文件比较完成?Step180线程结束,
Step210线程开始, Step220取出本流水线“文件校验值对比队列”中的一个文件,Step230能否在另一条流水线的“文件校验值对比队列”中查找到此文件名? Step240两个文件的校验值是否相同?, Step250将此文件名存入“文件校验值差异结果集合”, Step260将此文件放入本流水线的“文件读取队列”,Step270将此文件从本流水线的“文件校验值对比队列”中删除,Step280所有文件比较完成?Step290线程结束,
Step310线程开始, Step320取出本流水线“文件读取队列”中的一个文件,Step330将文件内容读取到内存之中, Step340将此文件放入本流水线的“文件解压队列”,Step350将此文件从本流水线的“文件读取队列”中删除, Step360所有文件比较完成?Step370线程结束,
Step410线程开始, Step420取出本流水线“文件解压队列”中的一个文件,Step430将文件内容在内存中解压, Step440将此文件放入本流水线的“文件内容比较队列”, Step450将此文件从本流水线的“文件解压队列”中删除, Step460所有文件比较完成?Step470线程结束,
Step510线程开始, Step520取出本流水线“文件内容对比队列”中的一个文件,Step530能否在另一条流水线的“文件内容对比队列”中查找到此文件名? Step540两个文件的内容是否相同? Step550将此文件从本流水线的“文件内容对比队列”中删除,Step560将此文件名存入 “文件内容差异结果集合”,Step570所有文件比较完成?Step580线程结束。
具体实施方式
参照图1,本发明所提出的打包文件对比方法的的两条流水线工作方式是:
两条流水线分别从存储A21中读取打包文件A210,以及从存储B22中读取打包文件B220。
所读入的文件信息分别输入流水线流程A120和流水线流程B130。
在流水线流程A120之中包含五个独立线程:文件名比较线程A S210,文件校验值比较线程A S220,文件读取线程A S230,文件解压线程A S240,文件内容比较线程A S250。所述的5个线程并行工作。
在流水线流程A120之中包含五个独立队列:文件名比较队列AD210,文件校验值比较队列AD220,文件读取队列AD230,文件解压队列AD240,文件内容比较队列AD250。
在流水线流程B130之中包含五个独立线程:文件名比较线程B S310,文件校验值比较线程B S320,文件读取线程B S330,文件解压线程B S340,文件内容比较线程B S350。所述的5个线程并行工作。
在流水线流程B130之中包含五个独立队列:文件名比较队列BD310,文件校验值比较队列BD320,文件读取队列BD330,文件解压队列BD340,文件内容比较队列BD350。
用于对比的包文件中,存储了每一个包内的文件名所对应的包内文件地址和校验值。该校验值可选用CRC。
流水线流程A120和流水线流程B130在程序启动时同时运行,流水线流程A120对文件的操作过程是:
1)查询打包文件A210内每一个文件名对应的包内地址;
2)根据文件在包内的地址由低到高排序;
3)将排序的文件名存入文件名对比队列D210中;
4)运行:文件名比较线程S210,文件校验值比较线程S220,文件读取线程S230,文件解压线程S240和文件内容比较线程S250;
流水线流程B130对文件的操作过程是:
1)查询打包文件B220内每一个文件名对应的包内地址;
2)根据文件在包内的地址由低到高排序;
3)将排序的文件名存入文件名对比队列D310中;
4)运行:文件名比较线程S310,文件校验值比较线程S320,文件读取线程S330,文件解压线程S340和文件内容比较线程S350;
两条流水线通过比较C130,C140,C150分别进行文件名比较,文件校验值比较以及文件内容比较,讲比较的结果输出到差异结果集合30。
差异结果集合30中存储了内容上有差异的文件。即文件对比的输出结果:文件名差异结果集合310,文件校验值差异结果集合320,文件内容差异结果集合330。
参照图2,利用本发明所提出的打包文件对比方法的装置以及系统包括以下模块:处理器1用于数据的计算处理(包含多线程多内核的通用CPU),输入部2用于输入处理(特别是用于包文件的读取),输出部3用于输出结果,主存储部4用于存储对比方法所需要的程序指令代码,辅存储部5用于文件队列的存储以及存储解压缩时所产生的临时文件,外部存储部20用于存储打包文件的数据,外部存储部20可包括存储A21用于存储打包文件A210,存储B22用于存储打包文件B220,差异结果集合30中存储了内容上有差异的文件。即文件对比的输出结果:文件名差异结果集合310,文件校验值差异结果集合320,文件内容差异结果集合330。
主存储部4主要包括三大部分:流水线流程控制110,流水线流程A120,流水线流程B130。
流水线流程控制110中包括:流水线进程管理部S110用于管理协调和调度流水线流程A120和水线流程B130,线程管理部S120用于管理调度流水线流程A120,线程管理部BS130用于管理调度流水线流程B130,文件名比较处理部S140对应文件名比较C130,文件校验值比较处理部S150对应文件校验值比较C140,文件内容比较处理部S160对应文件内容比较C150。
辅存储部5用于存储:对应流水线流程A120的文件名比较队列AD210,文件校验值比较队列AD220,文件读取队列A D230,文件解压队列AD240,文件内容比较队列AD250;对应流水线流程B130的文件名比较队列BD310,文件校验值比较队列BD320,文件读取队列BD330,文件解压队列BD340,文件内容比较队列BD350。
参照图3,每一个流水线所进行的处理包括以下步骤:
S10流水线开始,
S20查询每一个包内文件名对应的包内地址,
S30根据文件在包内地址由低到高进行排序,
S40将排序的文件名存入“文件对比队列”中,
S50运行文件名比较线程,文件校验值比较线程,文件解压线程,文件比较线程,
S60判断所有线程中的队列为空?,
S70若判断不为空则等待线程运行一段时间,
S80若判断唯恐则将对比结果输出到对应的差异结果集合中,
S90流水线结束。
参照图4,文件名比较线程包括以下步骤:
Step110线程开始,
Step120取出本流水线“文件名比较队列”中的一个文件,
Step130判断能否在另一条流水线的“文件名比较队列”中查找到此文件名?
Step160若不存在,将其存入“文件名差异结果集合”
Step140否则将此文件放入本流水线的“文件校验值对比队列”,
Step150将此文件从本流水线的“文件名比较队列”中删除,
Step170判断所有文件比较完成?
若没有完成,则跳回Step120处理下一个文件;
否则线程结束Step180。
参照图5,文件校验值比较线程包括以下步骤:
Step210线程开始,
Step220取出本流水线“文件校验值对比队列”中的一个文件,
Step230判断能否在另一条流水线的“文件校验值对比队列”中查找到此文件名?若不能则跳至Step280,
Step240判断两个文件的校验值是否相同?
若判断校验值不同则跳至Step250将此文件名存入“文件校验值差异结果集合”,
若判断校验值相同则跳至Step260将此文件放入本流水线的“文件读取队列”,
Step270将此文件从本流水线的“文件校验值对比队列”中删除,
Step280判断所有文件比较完成?
若全部执行完毕则执行Step290线程结束,
否则跳至Step220处理下一个文件。
参照图6,文件读取线程包括以下步骤:
Step310线程开始,
Step320取出本流水线“文件读取队列”中的一个文件,
Step330将文件内容读取到内存之中,
Step340将此文件放入本流水线的“文件解压队列”,
Step350将此文件从本流水线的“文件读取队列”中删除, Step360判断所有文件比较完成?
若是则跳至Step370线程结束,反之则跳至Step320处理下一个文件。
参照图7,文件解压线程包括以下步骤:
Step410线程开始,
Step420取出本流水线“文件解压队列”中的一个文件,
Step430将文件内容在内存中解压,
Step440将此文件放入本流水线的“文件内容比较队列”,
Step450将此文件从本流水线的“文件解压队列”中删除,
Step460所有文件比较完成?
若是则跳至Step470线程结束,反之则跳至Step420处理下一个文件。
参照图8,文件内容比较线程包括以下步骤:
Step510线程开始,
Step520取出本流水线“文件内容对比队列”中的一个文件,
Step530能否在另一条流水线的“文件内容对比队列”中查找到此文件名?
若不能查找到,则跳至Step570,反之则跳至Step540
Step540判断两个文件的内容是否相同?
若相同则Step550将此文件从本流水线的“文件内容对比队列”中删除,
若不相同则Step560将此文件名存入 “文件内容差异结果集合”,
Step570判断所有文件比较完成?
若全部完成则跳至Step580线程结束,反之则跳至Step520处理下一个文件。
具体实施例一:
若有两个包文件A和B,其中A这个包中有a、b、c三个文件,B这个包中有a、b、c、d四个文件, 则在文件名比较C130处可率先区分出d文件是一个B包中专有的文件,因此将其输出到差异结果集30之中的文件名差异结果集合310之后也就不需要再将d文件进行读取、解压、内容比较等一系列操作。从而可以大大提高处理效率,节省时间。
具体实施例二:
若有A、B两套包。其中包含的文件信息如下:
假设B包所在的流水线先运行, 且以较快速度运行完成。则A包所在的流水线可以如下方式处理a、b、c、d四个文件:
1.执行S20查询每一个包内文件名对应的包内地址,执行S30根据文件在包内的地址由低到高排序。
2.执行S40将排序的文件名存入“文件名对比队列”D210中。
3.1执行Step120取出“文件名比较队列”D210中的第一个文件,即文件a。
3.2执行Step130查找另一条流水线的“文件名比较队列”D310中查找此文件名。
3.3此时发现找不到, 则执行Step160将a文件放入文件名差异结果集合310中。
4.1执行Step120取出“文件名比较队列”D210中的下一个文件,即文件b。
4.2执行Step130查找另一条流水线的“文件名比较队列”D310中查找此文件名。
4.3此时发现可以找到, 则执行Step140将b文件放入本流水线的“文件校验值对比队列”D220,并执行Step150将其从本流水线的“文件名比较队列”D210中删除。
4.4执行Step220取出“文件校验值对比队列”D220 中的下一个文件,即文件b。
4.5执行Step230在另一条流水线的“文件校验值对比队列”D320中查找此文件名。
4.6执行Step240对比两个文件的校验值。
4.7若时两个文件的校验值不同(A包中校验值=456,B包中校验值=134),执行Step250将b文件存入文件校验值差异结果集320中。
5.1执行Step120取出“文件名比较队列”D210中的下一个文件,即文件c。
5.2执行Step130查找另一条流水线的“文件名比较队列”D310中查找此文件名。
5.3此时发现可以找到, 则执行Step140将c文件放入本流水线的“文件校验值对比队列”D220,并执行Step150将其从本流水线的“文件名比较队列”D210中删除。
5.4执行Step220取出“文件校验值对比队列”D220中的下一个文件,即文件c。
5.5执行Step230在另一条流水线的“文件校验值对比队列”D320中查找此文件名。
5.6执行Step240对比两个文件的校验值。此时两个文件的校验值相同,则执行Step260将此文件放入本流水线的“文件读取队列”D230,并执行Step270将其从本流水线的“文件校验值对比队列”D220中删除。
5.7执行Step320取出“文件读取队列”D230 中的下一个文件,即文件c。执行Step330将文件内容读取到内存中。之后执行Step340将c文件放入本流水线的“文件解压队列”D240,并执行Step350将其从本流水线的“文件读取队列”D230中删除。
5.8执行Step420取出“文件解压队列”D240 中的下一个文件,即文件c。执行Step430将文件内容在内存中解压。执行Step440将此文件放入本流水线的“文件内容比较队列”D250,并执行Step450将其从本流水线的“文件解压队列”D240中删除。
5.9执行Step520取出“文件内容对比队列”D250 中的下一个文件,即文件c。
5.10执行Step530在另一条流水线的“文件内容比较队列”D350中查找此文件名。
5.11执行Step540比较文件内容,此时两个文件内容不同,则执行Step560将其存入文件内容差异结果集合330中。
6.1执行Step120取出“文件名比较队列”D210中的下一个文件,即文件d。
6.2执行Step130查找另一条流水线的“文件名比较队列”D310中查找此文件名。
6.3此时发现可以找到, 则执行Step140将d文件放入本流水线的“文件校验值对比队列”D220,并执行Step150将其从本流水线的“文件名比较队列”D210中删除。
6.4执行Step220取出“文件校验值对比队列”D220 中的下一个文件,即文件d。
6.5执行Step230在另一条流水线的“文件校验值对比队列”D320中查找此文件名。
6.6执行Step240对比两个文件的校验值。此时两个文件的校验值相同,则执行Step260将此文件放入本流水线的“文件读取队列”D230,并执行Step270将其从本流水线的“文件校验值对比队列”D220中删除。
6.7执行Step320取出“文件读取队列”D230 中的下一个文件,即文件d。执行Step330将文件内容读取到内存中。之后执行Step340将d文件放入本流水线的“文件解压队列”D240,并执行Step350将其从本流水线的“文件读取队列”D230中删除。
6.8执行Step420取出“文件解压队列”D240中的下一个文件,即文件d。执行Step430将文件内容在内存中解压。执行Step440将此文件放入本流水线的“文件内容比较队列”D250,并执行Step450将其从本流水线的“文件解压队列”D240中删除。
6.9执行Step520取出“文件内容比较队列”D250 中的下一个文件,即文件d。
6.10执行Step530在另一条流水线的“文件内容比较队列”D350中查找此文件名。
6.11执行Step540比较文件内容,此时两个文件内容相同(两个包里面此文件的内容都是“内容=ddd”),执行Step550将其从本流水线的“文件内容比较队列”D250中删除。(d是一个内容,校验值都相同的文件。所以最终没有被放入差异文件集中,也无需输出。)
以上是对本发明的较佳实施进行了具体说明,但本发明并不限于所述实施例,熟悉本领域的技术人员在不违背本发明精神的前提下还可作出种种的等同变形或替换,这些等同的变型或替换均包含在本申请权利要求所限定的范围内。