CN110109881A - 文件拆分的方法、装置、电子设备及存储介质 - Google Patents
文件拆分的方法、装置、电子设备及存储介质 Download PDFInfo
- Publication number
- CN110109881A CN110109881A CN201910402286.9A CN201910402286A CN110109881A CN 110109881 A CN110109881 A CN 110109881A CN 201910402286 A CN201910402286 A CN 201910402286A CN 110109881 A CN110109881 A CN 110109881A
- Authority
- CN
- China
- Prior art keywords
- file
- fractionation
- split
- splitter
- source file
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/10—File systems; File servers
- G06F16/16—File or folder operations, e.g. details of user interfaces specifically adapted to file systems
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5027—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
- G06F9/5038—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals considering the execution order of a plurality of tasks, e.g. taking priority or time dependency constraints into consideration
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Human Computer Interaction (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供了一种文件拆分的方法、装置、电子设备和存储介质,获取待拆分的源文件后,根据目标文件的数量和待拆分的源文件的拆分类型将源文件划分为N个拆分区间,并为拆分区间一一对应的分配N个拆分器,最后触发每个拆分器,使每个拆分器拆分对应的拆分区间,得到目标文件,其中拆分器是预先创建的线程,或者,预先创建的进程。本发明提供的技术方案中,每个拆分器都只负责拆分对应的拆分区间,因此不同拆分器工作时不会互相干扰,不需要与其他拆分器同步,从而提高文件拆分效率。
Description
技术领域
本发明涉及计算机技术领域,特别涉及一种文件拆分的方法、装置、电子设备及存储介质。
背景技术
计算机运行时,由于存储介质的容量限制和网络传输能力限制等原因,需要对数据量较大的源文件进行拆分,也就是将源文件中的数据分别保存为多个数据量较小的目标文件,以方便存储或传输。
现有的一种文件拆分的方法是,生产者线程读取源文件中的数据,依次写入缓存队列中。在缓存队列非空时,多个消费者线程依次获取缓存队列中的数据并将其写入目标文件。
现有技术的问题在于,由于多个消费者线程共用一个缓存队列,因此每个消费者线程不仅要向目标文件写入数据,还要执行特定的同步程序以实现与其他消费者线程的同步,导致文件拆分效率降低。
发明内容
基于上述现有技术的不足,本发明提出一种文件拆分的方法、装置、电子设备及存储介质,以解决现有的文件拆分方法效率较低的问题。
为解决上述问题,现提出的方案如下:
本发明第一方面公开一种文件拆分的方法,包括:
获取待拆分的源文件;
将所述源文件划分为N个拆分区间,其中,所述N是根据服务器的硬件资源,目标文件的数量和所述待拆分的源文件的拆分类型确定的正整数,所述服务器的硬件资源包括磁盘类型;
针对所述N个拆分区间中的每一个拆分区间,为该拆分区间指定一个拆分器;其中,所述拆分器用于指代预先创建的拆分线程或拆分进程;
触发每个所述拆分器,使每个所述拆分器对指定的拆分区间进行拆分,得到目标文件。
可选的,所述触发每个所述拆分器,使每个所述拆分器对指定的拆分区间进行拆分,得到目标文件之前,还包括:
设置所述拆分器的系统属性。
可选的,所述待拆分的源文件的类型包括,有序拆分和无序拆分;
所述N是根据服务器的硬件资源,目标文件的数量和所述待拆分的源文件的拆分类型确定的正整数,包括:
若所述待拆分的源文件的拆分类型是无序拆分,则所述N等于目标文件的数量M,所述M是正整数;
若所述待拆分的源文件的拆分类型是有序拆分,则所述N是大于1,且小于或等于预设阈值的正整数。
可选的,所述将所述源文件划分为N个拆分区间,包括:
创建所述源文件的N个指针;其中,所述N个指针都指向所述源文件的第一个位置,所述源文件的每一个字符对应一个位置,所述位置指代对应字符的存储地址;
根据所述源文件的字符数和所述拆分区间的数量N确定拆分间隔;
根据所述拆分间隔移动所述N个指针中的N-1个指针,使所述N个指针分别指向所述源文件中N个不同的位置,且任意两个相邻的指针指向的位置之间的距离为所述拆分间隔,得到由所述指针分隔的N个拆分区间。
可选的,所述根据所述拆分间隔移动所述N个指针中的N-1个指针之后,还包括:
调用换行函数,使所述移动过的N-1个指针移动至当前指向的位置的下一行的开始位置,得到由所述指针分隔的N个拆分区间。
可选的,所述触发每个所述拆分器,使每个所述拆分器对指定的拆分区间进行拆分,得到目标文件,包括:
若所述待拆分的源文件的拆分类型是无序拆分,则触发每个所述拆分器,使每个所述拆分器对指定的拆分区间进行拆分后,将得到的结果直接写入目标文件;
若所述待拆分的源文件的拆分类型是有序拆分,则触发每个所述拆分器,使每个所述拆分器对指定的拆分区间进行拆分后,将得到的结果写入与所述拆分区间对应的中间文件;触发预先创建的合并线程或合并进程将所述中间文件合并得到目标文件。
本发明第二方面公开一种文件拆分的装置,包括:
获取单元,用于获取待拆分的源文件;
划分单元,用于根据服务器的硬件资源,目标文件的数量和所述待拆分的源文件的拆分类型确定拆分区间的数量N,并将所述源文件划分为N个拆分区间;其中,所述服务器的硬件资源包括磁盘类型;
分配单元,用于针对所述N个拆分区间中的每一个拆分区间,为该拆分区间指定一个拆分器;其中,所述拆分器用于指代预先创建的拆分线程或拆分进程;
触发单元,触发每个所述拆分器,使每个所述拆分器对指定的拆分区间进行拆分,得到目标文件。
可选的,所述分配单元还用于:设置所述拆分器的系统属性。
可选的,所述划分单元包括:
确定单元,用于根据服务器的硬件资源,目标文件的数量和所述待拆分的源文件的拆分类型确定拆分区间的数量N,并根据所述源文件的字符数和所述拆分区间的数量N确定拆分间隔;其中,所述服务器的硬件资源包括包括磁盘类型;
创建单元,用于创建所述源文件的N个指针,其中,所述N个指针都指向所述源文件的第一个位置;其中,所述源文件的每一个字符对应一个位置,所述位置指代对应字符的存储地址;
移动单元,用于根据所述拆分间隔移动所述N个指针中的N-1个指针,使所述N个指针分别指向所述源文件中N个不同的位置,且任意两个相邻的指针指向的位置之间的距离为所述拆分间隔,得到由所述指针分隔的N个拆分区间。
可选的,所述待拆分的源文件的拆分类型包括,有序拆分和无序拆分;
所述确定单元用于根据服务器的硬件资源,目标文件的数量和所述待拆分的源文件的拆分类型确定拆分区间的数量N,包括:
若所述待拆分的源文件的拆分类型是有序拆分,则将拆分区间的数量N确定为大于1,且小于或等于预设阈值的正整数;
若所述待拆分的源文件的拆分类型是无序拆分,则将拆分区间的数量N确定为目标文件的数量M。
可选的,所述触发单元用于触发每个所述拆分器,使每个所述拆分器对指定的拆分区间进行拆分,得到目标文件,包括:
若所述待拆分的源文件的拆分类型是无序拆分,则触发每个所述拆分器,使每个所述拆分器对指定的拆分区间进行拆分后,将得到的结果直接写入目标文件;
若所述待拆分的源文件的拆分类型是有序拆分,则触发每个所述拆分器,使每个所述拆分器对指定的拆分区间进行拆分后,将得到的结果写入与所述拆分区间对应的中间文件;并触发预先创建的合并线程或合并进程将所述中间文件合并得到目标文件。
可选的,所述移动单元还用于:
调用换行函数,使所述移动过的N-1个指针移动至当前指向的位置的下一行的开始位置,得到由所述指针分隔的N个拆分区间。
本发明第三方面公开一种电子设备,包括处理器和存储器;其中:
所述存储器用于存储计算机指令;
所述处理器用于执行所述存储器存储的计算机指令,具体执行如本发明第一方面任意一项公开的文件拆分的方法。
本发明第四方面公开一种存储介质,用于存储程序,所述程序被执行时,用于实现如本发明第一方面任意一项公开的文件拆分的方法。
本发明提供了一种文件拆分的方法、装置、电子设备和存储介质,获取待拆分的源文件后,根据目标文件的数量和待拆分的源文件的拆分类型将源文件划分为N个拆分区间,并将拆分区间一一对应的分配给N个拆分器,最后触发每个拆分器,使每个拆分器拆分对应的拆分区间,得到目标文件,其中拆分器是预先创建的线程,或者,预先创建的进程。本发明提供的技术方案中,每个拆分器都只负责拆分对应的拆分区间,因此不同拆分器工作时不会互相干扰,不需要与其他拆分器同步,从而提高文件拆分效率。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本发明实施例公开的一种文件拆分的方法的流程图;
图2为本发明实施例公开的一种文件的有序拆分的方法的流程图;
图3为本发明实施例公开的一种文件的无序拆分的方法的流程图;
图4为本发明实施例公开的一种文件拆分的装置的结构示意图;
图5为本发明实施例公开的一种电子设备的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本申请实施例公开了一种文件拆分的方法,请参考图1,该方法包括以下步骤:
S101、获取待拆分的源文件。
其中,源文件是一个由多个字符组成的文本文件。
S102、将源文件划分为N个拆分区间。
其中,拆分区间的数量N是根据服务器的硬件资源,目标文件的数量和本次文件拆分的类型确定的正整数;其中,服务器的硬件资源包括磁盘类型。
需要说明的是,拆分区间用于指代源文件中的一部分连续的字符,也就是源文件中的部分文本,一个拆分区间中的第一个字符称为起始字符,起始字符的存储地址,称为拆分区间的起始位置,最后一个字符称为结束字符,结束字符的存储地址称为拆分区间的结束位置。在一个文件中,只要确定拆分区间的开始位置和结束位置,就可以确定对应的拆分区间。类似的,源文件中每个字符的存储地址,都可以认为是这个字符对应的位置。
还需要说明的是,划分后得到的N个拆分区间,包括源文件中的所有字符,且没有重复。也就是说,源文件中的任意字符都属于划分后的N个拆分区间中的某一个,且只属于这个拆分区间。
以一个包含1000个字符的文本文件A为例,从第1个字符到第300个字符的文本可以记为是文本文件A的第一个拆分区间,从第301个字符到第650个字符的文本可以记为是文本文件A的第二个拆分区间,从第651个字符到第1000个字符的文本可以记为是文本文件A的第三个拆分区间。其中,第1个字符的存储地址就是第一个拆分区间的起始位置,第300个字符的存储地址就是第一个拆分区间的结束位置,其他拆分区间的起始位置和结束位置类似。
可选的,一个文件可以用多种方式进行划分,得到不同的拆分区间。例如上述文本文件A,也可以按第1个至第100个字符,第101个至第200个字符,第201个至第300个字符……第901个至第1000个字符的方式,将每一百个字符划分为一个拆分区间。
在本实施例中,划分方式和划分得到的拆分区间的数量N可以根据服务器的硬件资源,目标文件的数量,以及源文件的拆分类型确定。
其中,源文件的拆分类型包括有序拆分和无序拆分两种。若将源文件拆分后得到的目标文件中,文本的先后顺序与源文件中对应文本的先后顺序一致,那么对源文件进行的就是有序拆分;若将源文件拆分后得到的目标文件中,文本的先后顺序与源文件中对应文本的先后顺序不一致,那么对源文件进行的就是无序拆分。
具体的,假设一个源文件有10行,将其拆分成两个目标文件,每个目标文件有5行,其中奇数行(即1、3、5、7、9行)属于第一个目标文件,偶数行(即2、4、6、8、10行)属于第二个目标文件。若要对源文件进行有序拆分,则第一个目标文件中的5行文本,应当按照上述1、3、5、7、9的先后顺序排列,第二个目标文件中的5行文本,也应当按照2、4、6、8、10的先后顺序排列;相反的,若要对源文件进行无序拆分,则对于两个目标文件中文本的排列顺序没有要求,即第一个目标文件中的5行文本,可以按5、3、1、9、7的顺序排列,也可以按其他任意一种顺序排列,而不必严格遵守源文件中的先后顺序,第二个目标文件类似。
若对源文件进行的是有序拆分,则上述拆分区间的数量N设置为任意一个大于1,且不大于预设的阈值的整数。为了提高文件拆分的效率,前述阈值一般设置为不大于5,也就是说,对源文件进行有序拆分时,拆分区间的数量N可以设置为大于1,小于或等于5的整数,通常可以使N等于3。
若对源文件进行的是无序拆分,则上述拆分区间的数量N应当与需要得到的目标文件的数量相同。也就是说,对源文件进行无序拆分时,已知需要将源文件拆分成M个目标文件,那么拆分区间的数量N应当等于M。
S103、针对上述N个拆分区间中的每一个拆分区间,为该拆分区间指定一个拆分器。
其中,拆分器可以是预先创建的拆分线程,也可以是预先创建的拆分进程。
由于根据拆分区间的起始位置和结束位置可以确定对应的拆分区间,因此,步骤S103中的为拆分区间指定拆分器的过程,可以通过,将拆分区间的起始位置和结束位置作为参数传递于对应的拆分器来实现。
S104、触发每个拆分器,使每个拆分器对相应的拆分区间进行拆分,得到目标文件。
拆分器对相应的拆分区间进行拆分,实际是逐行读取拆分区间,然后根据预设的拆分规则将读取的每一行文本写入对应的目标文件中。
其中,根据文件拆分的类型的不同,步骤S104的具体实现方式也不同。若当前文件拆分的类型是无序拆分,则读取的文本可以直接写入目标文件中,若当前文件拆分的类型是有序拆分,则读取的文本需要先写入中间文件中,在通过合并中间文件得到目标文件。
本申请实施例提供的文件拆分方法,获取待拆分的源文件后,根据目标文件的数量和待拆分的源文件的拆分类型将源文件划分为N个拆分区间,并为拆分区间一一对应的分配N个拆分器,最后触发每个拆分器,使每个拆分器拆分对应的拆分区间,得到目标文件,其中拆分器是预先创建的线程,或者,预先创建的进程。本申请实施例提供的方法中,每个拆分器都只负责对该拆分器对应的拆分区间进行拆分,因此不同拆分器工作时不会互相干扰,不需要与其他拆分器同步,从而有效地提高文件拆分效率。
本申请另一实施例提供了一种文件的有序拆分的方法,请参考图2,本实施例提供的方法包括以下步骤:
S201、获取待拆分的源文件。
S202、创建N个拆分器。
在本实施例提供的文件的有序拆分的方法中,N是预设的正整数,与要拆分得到的目标文件的数量无关。可选的,在本实施例中,N可以设置为小于或等于5,大于1的正整数。
可选的,在有序拆分中,保持拆分器的数量小于或等于5有利于提高文件拆分效率。
需要说明的是,在本实施例提供的文件拆分的方法中,拆分器与拆分区间之间是一一对应的关系,因此,上述拆分器的数量N,就是后续对源文件进行划分时需要得到的拆分区间的数量。
S203、设置所述拆分器的系统属性。
拆分器的系统属性包括进程优先级(或线程优先级)、CPU亲和性和I/O优先级等。其中,拆分器的进程优先级(或线程优先级)和CPU亲和性设置为高,以方便拆分器在运行过程中获得更多的系统资源,I/O优先级设置为实时,以方便在I/O负载过高时,获取更稳定拆分效率。
需要说明的是,步骤S203的设置对于本实施例提供的方法是可选的。上述对系统属性的设置,其目的在于提高本实施例提供的方法的拆分效率,即使不进行上述系统属性的设置,或者进设置其中的部分系统属性,本实施例提供的方法也能够完成对文件的有序拆分。
S204、创建源文件的N个指针。
创建的指针是文件类型的指针,即FILE*类型的指针。
在本实施例提供的方法中,所有刚创建的指针都指向源文件中的第一个字符对应的位置。
可选的,上述N个指针可以通过调用fopen函数以只读的方式打开N次源文件得到。
S205、根据源文件的字符数和指针的数量N确定拆分间隔。
指针的数量等于需要得到的拆分区间的数量,因此步骤S205也可以认为是根据源文件的字符数和拆分区间的数量N确定拆分间隔。
可选的,本实施例具体采用以下方法确定拆分间隔:
用源文件的字符数除以指针的数量N,对得到的结果取整后即为拆分间隔。
可选的,上述对源文件的字符数除以指针的数量N得到的结果取整时,可以按照四舍五入进行取整,也可以直接向上取整或向下取整。
例如,对于一个由454个字符组成的源文件,若N预设为5,则用源文件的字符数除以N得到90.8,对这个结果向下取整,得到拆分间隔为90。
S206、根据拆分间隔移动N-1个指针,得到由N个指针分隔的N个拆分区间。
移动指针,实际上就是改变指针指向的位置。
步骤S206中根据拆分间隔移动N-1个指针,是指,从上述N个指针中选择一个,使其始终指向源文件的第一个字符对应的位置,逐个移动其他N-1个指针,使这N-1个指针与源文件的第一个字符的距离是拆分间隔的1倍,2倍,3倍……N-1倍,使源文件被这N个指针分隔为N个拆分区间。
需要说明的是,一个指针与源文件中的特定字符的距离,是指这个指针指向的位置对应的字符与这个特定字符之间的距离,类似的,两个指针之间的距离,是指这两个指针指向的字符之间的距离。
对于任意一个指针,这个指针指向某个位置,相当于是这个指针指向这个位置对应的字符;相对的,一个指针指向某个字符,也可以认为是指向这个字符对应的位置。
源文件中两个字符之间的距离,等于这两个字符之间的其他字符的数量加1。也就是说,对于源文件中的两个字符(记为字符A和字符B),若字符A是源文件的第1个字符,字符B是源文件中的第5个字符,那么字符A和字符B之间一共有3个字符(即源文件的第2、3和4个字符),按照上述定义,字符A和字符B的距离为4。
参考步骤S205中提出的实例,根据计算得到拆分间隔为90后,需要从创建的5个指向源文件的第一个字符的指针中任选进行移动,使其指向与源文件的第一个字符的距离为90的字符,也就是使其指向源文件的第91个字符;然后再从指向源文件的第一个字符的4个指针中任意选择一个进行移动,使其指向源文件的第181个字符,以此类推,直至创建的5个指针分别指向源文件的第1个、第91个、第181个、第271个和第361个字符。
在本实施例中,拆分区间是以指针指向的字符和源文件的最后一个字符为边界的源文件中的部分文本。其中,每两个相邻的指针指向的字符之间的文本,以及最接近源文件中最后一个字符的指针指向的字符与源文件的最后一个字符之间的文本,都可以称为一个拆分区间。对于以两个相邻的指针指向的字符为边界的拆分区间,与源文件的第一个字符距离较近的指针记为这个拆分区间的头指针,与源文件的第一个字符距离较远的指针记为这个拆分区间的尾指针,这个拆分区间的起始字符是头指针指向的字符,结束字符是尾指针指向的字符的前一个字符。
对于源文件中的最后一个拆分区间,也就是以最接近源文件的最后一个字符的指针指向的字符和源文件最后一个字符为边界的拆分区间,其起始字符是最接近源文件结尾的指针指向的字符,其结束字符是源文件的最后一个字符。
经过步骤S206的移动后,可以依据每个指针指向的字符在源文件中的顺序,依次将这些指针记为源文件的第一指针,第二指针,第三指针……等等。
具体的,假设对一个源文件创建了3个指针,经过步骤S205的移动后,会得到3个拆分区间,从源文件的第一个字符开始,分别是第一指针指向的字符(即源文件的第一个字符)和第二指针指向的字符之间的第一拆分区间,第二指针指向的字符和第三指针指向的字符之间的第二拆分区间,以及第三指针指向的字符和源文件的最后一个字符之间的第三拆分区间。
结合上述对拆分区间的起始字符和结束字符的定义,在上述例子中,第一拆分区间的起始字符是第一指针指向的字符,结束字符是第二指针指向的字符的前一个字符;第二拆分区间的起始字符是第二指针指向的字符,结束字符是第三指针指向的字符的前一个字符;第三拆分区间的起始字符是第三指针指向的字符,结束字符是源文件的最后一个字符。
S207、调用换行函数,使已经移动过的N-1个指针指向当前指向的位置的下一行的开始位置。
需要说明的是,上述换行函数可以是getline函数,也可以是功能与getline函数相似的其他预设的函数。
步骤S207是对除源文件的第一指针以外的其他N-1个指针调用换行函数,使这N-1个指针中的每一个都移动至当前指向的字符的下一行的开始位置。一个指针当前指向的字符,用于指代经过步骤S206的移动后,该指针指向的字符。一行的开始位置,是指这一行的第一个字符。
具体的,假设对于一个待拆分的源文件,经过步骤S206的移动后,有一个指针指向源文件中的第5行的一个字符,那么通过步骤S207对其调用换行函数后,这个指针将指向第6行的开始位置,即指向第6行的第一个字符。
对文本文件进行拆分,一般要求保持源文件中的每一行的完整,对源文件按行进行拆分,也就是说,源文件中的任意一行文本拆分后应当完整的保存在一个目标文件中,而不能出现源文件中的一行文本拆分成两部分,被分别保存在两个目标文件中的情况。
经过步骤S206对指针的移动后,除了仍然指向源文件的第一个字符的指针,其他指针指向的字符有可能不是某一行的第一个字符,也就是不在某一行的开始位置,因此需要调用换行函数以保证每个指针都指向源文件中某一行的第一个字符,以避免拆分后出现一行文本被拆分成两个部分的情况。
需要说明的是,上述步骤S207,仅仅是为了满足常见的文本文件拆分的要求,在对源文件中每一行文本的完整性不做要求的情况下,也可以不执行步骤S207。
由于本实施例中,拆分区间是以指针指向的字符分隔的区间,因此,步骤S2067执行换行函数对指针的移动,相当于是对步骤S206得到的拆分区间的调整,最终得到调整后的N个拆分区间。
本实施例中,步骤S205至步骤S207的过程,可以认为是对源文件进行划分得到多个拆分区间的一种具体实现方式。
还需要说明的是,如上述步骤S202至步骤S203所述的创建拆分器并设置系统属性的过程,以及上述步骤S204至步骤S206所述的将源文件划分成多个拆分区间的过程,这两个过程的执行顺序是可以互换的。在本申请的其他实施例中,也可以先对源文件进行划分得到多个拆分区间,然后再创建拆分器并设置拆分器的系统属性。
S208、将拆分区间的起始位置和结束位置作为拆分器的参数传递于拆分器。
需要说明的是,步骤S208的传递过程中,拆分区间和拆分器是一一对应的,也就是说,一个拆分区间的起始位置和结束位置,只能传递于一个拆分器,同时,一个拆分器也只能接受一个拆分区间的起始位置和结束位置作为这个拆分器的参数。
但是,本实施例对于一个拆分区间具体对应哪个拆分器不做限制,若将上述创建的N个拆分器分别记为第一个,第二个……第N个拆分器,将上述划分的N个拆分区间按先后顺序分别记为第一个,第二个……第N个拆分区间,在前述一一对应的前提下,这些拆分区间和拆分器可以随机匹配,也就是,第一个拆分器可以对应第一个至第N个拆分区间中的任意一个拆分区间,第二个拆分器可以对应第一个至第N个拆分区间中,除了第一个拆分器对应的拆分区间外的任意一个拆分区间,以此类推。
步骤S208中将拆分区间的起始位置和结束位置传递于拆分器的过程,可以认为是,为每个拆分区间一一对应的指定拆分器,或者,为每个拆分器一一对应的分配拆分区间的过程。
S209、触发所有拆分器,使每个拆分器对指定的拆分区间进行拆分,得到中间文件。
需要说明的是,所有拆分器被同时触发可以认为是同时对指定的拆分区间进行拆分。
本实施例中,拆分器对指定的拆分区间进行拆分的具体过程是:
拆分器读取拆分区间的第一行文本,根据预设的拆分规则对读取的文本进行判断,然后根据判断结果将读取的这一行文本写入对应的中间文件,然后读取拆分区间的下一行文本,再次对读取的文本执行判断和写入的过程,以此类推,直至拆分区间中的每行文本都被读取并写入对应的中间文件为止。
上述预设的拆分规则,可以认为是针对源文件中文本的一个分类标准,依据这个分类标准可以将源文件中的文本分成多个类别,类别的数量也就是需要拆分得到的目标文件的数量。步骤S209的拆分过程,相当于是按照分类标准将拆分区间中的文本分成多个类别,并将不同类别的文本分别保存的过程。
例如,可以假设源文件中每行文本都包含一个日期,那么这个预设的拆分规则可以是按日期的先后制定的分类标准,也就是某个日期之前的归为一类,这个日期与另一个日期之间的归为另一类,以此类推。
在本实施例提供的文件的有序拆分的方法中,每个拆分器都有对应的多个中间文件,用于保存这个拆分器对指定的拆分区间进行拆分后得到的结果,每个拆分器对应的中间文件的个数,与本次拆分需要的目标文件的个数一致。若某次拆分需要把一个源文件拆分成6个目标文件,那么在拆分过程中,每个拆分器都对应的有6个中间文件,其中的每个中间文件对应一个类别,拆分器每读取拆分区间中的一行,就依据拆分规则判断这一行属于哪个类别,然后将这一行文本写入这个拆分器的与该类别对应的中间文件中。
具体的,假设有一个需要拆分成3个目标文件的源文件,根据拆分规则,这个源文件的文本可以分为3个类别(记为类别1、类别2和类别3)。应用本实施例提供的方法,将这个源文件划分为3个拆分区间,并创建了对应的3个拆分器(记为第一拆分器、第二拆分器和第三拆分器)。那么,在执行步骤S209的拆分过程时,将产生9个中间文件,这些中间文件与拆分器和类别的对应关系可以参照下表1。
第一拆分器 | 第二拆分器 | 第三拆分器 | |
类别1 | 中间文件1 | 中间文件2 | 中间文件3 |
类别2 | 中间文件4 | 中间文件5 | 中间文件6 |
类别3 | 中间文件7 | 中间文件8 | 中间文件9 |
表1
在表1中,同一列的三个中间文件对应于一个拆分器(即该列第一行所示拆分器),同时同一行的三个中间文件,又对应于一个类别(即该行第一列所示类别)。
也就是说,每个拆分器都对应三个中间文件,同时一个拆分器对应的三个中间文件又分别对应于三个不同类别,相对的,每个类别都对应三个中间文件,同时一个类别对应的三个中间文件又分别对应三个不同的拆分器。
此外,由于拆分器与源文件中的拆分区间一一对应,因此,中间文件与拆分器的对应关系,相当于是中间文件与拆分区间的对应关系。
拆分器进行拆分后,将得到的拆分结果(也就是上述读取的每一行文本)写入中间文件而不是直接写入目标文件,是为了保证最后得到的目标文件中文本的先后顺序与源文件中的先后顺序一致,也就是为了满足文件的有序拆分的要求。若每个拆分器拆分后直接将得到的结果写入目标文件,由于不同拆分器的拆分进度并不一致,可能出现源文件后段的拆分区间的拆分速度比前段的拆分区间的拆分速度快的情况,使得目标文件中文本的排列顺序与源文件不一致。
具体的,对于一个10行的源文件,假设需要将其中的奇数行写入第一目标文件,将其中的偶数行写入第二目标文件。通过执行本实施例的方法,将第1行至第5行划分为第一个拆分区间,第6行至第10行划分为第二个拆分区间,然后执行步骤S208,在此过程中,可能出现第二个拆分区间对应的拆分器已经开始读取第9行文本,而第一个拆分区间刚开始读取第2行文本的情况,此时,若允许拆分结果直接写入目标文件,会导致第二目标文件中写入的第1行和第2行文本,分别是源文件的第6行和第8行文本,而源文件中的第2行文本,则排到了第二目标文件的第3行,即目标文件中文本的先后顺序与源文件中的先后顺序不一致,因此不满足文件的有序拆分的要求。
通过设置中间文件并将每个拆分器的拆分结果写入中间文件,可以有效避免上述错误发生,即使出现上述第二拆分区间的拆分速度快于第一拆分区间的情况,第二拆分区间中的第6、8和10行文本也会被写入第二拆分区间对应的一个中间文件中,第7和9行则被写入第二拆分区间对应的另一个中间文件中;相对的,第一拆分区间也被分解成两个对应的中间文件,分别保存源文件的第1、3和5行,以及源文件的第2和4行。只要按照源文件中文本的先后顺序合并这些中间文件,就可以保证最后得到的两个目标文件中文本的先后顺序与源文件中文本的先后顺序一致。
S210、触发合并器,使合并器对中间文件进行合并,得到目标文件。
合并器,用于指代预先创建的,用于合并上述中间文件的线程或进程。合并器的个数,等于本次拆分需要的目标文件的个数,即按照拆分规则分类得到的类别的个数。其中,每个目标文件,或者说每个类别,对应一个合并器,也可以认为是每个合并器属于一个类别。
每个合并器,仅用于合并它所属的类别对应的中间文件。参照上述表1,在执行步骤S210时,对于表1所示的情况,类别1、类别2和类别3会分别有一个属于该类别的合并器,可以分别记为合并器1、合并器2和合并器3,其中合并器1仅用于合并对应于类别1的三个中间文件(即中间文件1、2和3),合并器2用于合并对应于类别2的三个中间文件(即中间文件4、5和6),合并器3用于合并对应于类别3的三个中间文件(即中间文件7、8和9)。
合并中间文件的过程,可以认为是逐个将合并器所属的类别对应的中间文件写入目标文件的过程。
合并器对中间文件进行合并时,严格遵守源文件的先后顺序。也就是说,一个合并器合并对应的类别的中间文件时,先将这个类别对应的多个中间文件中,对应于源文件中第一个拆分区间的中间文件写入目标文件,然后写入第二个拆分区间对应的中间文件,接着是第三个拆分区间,第四个拆分区间,以此类推,直至这个类别对应的中间文件都被写入目标文件,完成合并。上述拆分区间编号,是从源文件的起始处开始,按照拆分区间在源文件中的先后顺序设定的。
本申请另一实施例提供了一种文件的无序拆分的方法,请参考图3,该方法包括以下步骤:
S301、获取待拆分的源文件。
S302、创建N个拆分器。
在本实施例提供的文件的无序拆分的方法中,N设置为拆分后需要得到的目标文件的数量。
S303、创建源文件的N个指针。
S304、根据源文件的字符数和指针的数量N确定拆分间隔。
S305、根据拆分间隔移动上述N个指针中的N-1个指针,得到由N个指针分隔的N个拆分区间。
S306、调用换行函数,使已经移动过的N-1个指针指向当前指向的位置的下一行的开始位置。
S307、将拆分区间的起始位置和结束位置作为拆分器的参数传递于拆分器。
S308、触发所有拆分器,使每个拆分器对指定的拆分区间进行拆分,得到目标文件。
需要说明的是,所有拆分器被同时触发可以认为是同时对指定的拆分区间进行拆分。
本实施例提供的文件的无序拆分的方法中,拆分器对指定的拆分区间进行拆分的具体过程与前一实施例中的文件的有序拆分方法类似,也是逐行读取拆分区间,按照预设的拆分规则对读取的每行文本进行分类,然后根据分类结果将读取的文本写入文件中。区别仅在于,在对源文件进行有序拆分时,拆分器读取的拆分区间中的每行文本要先写入中间文件,然后再对中间文件进行合并得到目标文件。在本实施例提供的文件的无序拆分的方法中,拆分器读取的拆分区间中的每行文本可以直接写入目标文件,相对于文件的有序拆分的方法,不需要执行合并文件的步骤。因此,通常情况下,文件的无序拆分的效率高于文件的有序拆分的效率。
基于上述实施例提供的文件拆分的方法,本申请另一实施例还提供了一种文件拆分装置,请参考图4,该装置包括以下单元:
获取单元401,用于获取待拆分的源文件。
上述源文件是由多个字符组成的文本文件。
划分单元402,用于根据目标文件的数量和待拆分的源文件的拆分类型确定拆分区间的数量N,并将源文件划分为N个拆分区间。
可选的,划分单元402包括:
确定单元,用于根据服务器的硬件资源,目标文件的数量和所述待拆分的源文件的拆分类型确定拆分区间的数量N,并根据源文件的字符数和拆分区间的数量N确定拆分间隔。
其中,上述服务器的硬件资源包括磁盘类型。
创建单元,用于创建待拆分的源文件的N个指针。
移动单元,用于根据拆分间隔移动N个指针中的N-1个指针,使N个指针分别指向源文件中N个不同的位置,且任意两个相邻的指针指向的位置之间的距离为上述拆分间隔,得到由指针分隔的N个拆分区间。
上述N个指针可以通过调用fopen函数打开源文件N次得到,这N个指针创建后都指向源文件的第一个字符。
可选的,待拆分的源文件的拆分类型包括,有序拆分和无序拆分。
上述确定单元具体用于:
若待拆分的源文件的拆分类型是有序拆分,则将拆分区间的数量N确定为大于1,且小于或等于预设阈值的整数;
若待拆分的源文件的拆分类型是无序拆分,则将拆分区间的数量N确定为目标文件的数量M。
可选的,上述划分拆分区间的过程中,移动单元还可以用于,在完成对N-1个指针的移动后,对这N-1个指针调用换行函数,使移动过的N-1个指针移动至当前指向的位置的下一行的开始位置,也就是对拆分区间的范围进行调整,得到由N个指针分隔的,调整后的N个拆分区间。
分配单元403,用于针对上述N个拆分区间中的每一个拆分区间,为该拆分区间指定一个拆分器。
其中,拆分器用于指代预先创建的拆分线程或拆分进程。拆分器可以由分配单元403预先创建。
可选的,分配单元403在为每个设置拆分区间分配拆分器之前,可以设置拆分器的系统属性,例如,可以设置拆分器的进程优先级,CPU亲和性以及I/O优先级。
触发单元404,触发每个拆分器,使每个拆分器对指定的拆分区间进行拆分,得到目标文件。
若待拆分的源文件的拆分类型是无序拆分,则触发单元404具体按以下过程进行拆分:
触发每个所述拆分器,使每个所述拆分器对指定的拆分区间进行拆分后,将得到的结果直接写入目标文件。
若所述待拆分的源文件的拆分类型是有序拆分,则触发单元404具体按以下过程进行拆分:
触发每个拆分器,使每个拆分器对指定的拆分区间进行拆分后,将得到的结果写入与拆分区间对应的中间文件;然后触发预先创建的合并线程或合并进程将中间文件合并得到目标文件。
其中,合并线程或合并进程可以由拆分器触发单元预先创建。
本实施例提供的文件拆分的装置,通过获取单元401获取待拆分的源文件后,由划分单元402根据目标文件的数量和待拆分的源文件的拆分类型确定拆分区间的数量N,并将源文件划分为N个拆分区间,然后由分配单元为每个拆分区间一一对应的分配拆分器,最后通过触发单元404触发每个拆分器,使每个拆分器拆分对应的拆分区间,得到目标文件。本发明提供的技术方案中,在划分单元402划分出N个拆分区间后,每个拆分器都只负责拆分对应的拆分区间,因此不同拆分器工作时不会互相干扰,不需要与其他拆分器同步,从而提高文件拆分效率。
结合上述文件拆分的方法,本申请另一实施例提供一种电子设备,请参考图5,包括处理器501和存储器502,其中:
存储器502用于存储计算机指令。
处理器501用于执行存储器502存储的计算机指令,具体执行如本申请任一实施例提供的文件拆分的方法。
本申请另一实施例还提供一种存储介质,用于存储程序,存储的程序被执行时,用于实现如本申请任一实施例提供的文件拆分的方法。
专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
Claims (10)
1.一种文件拆分的方法,其特征在于,包括:
获取待拆分的源文件;
将所述源文件划分为N个拆分区间,其中,所述N是根据服务器的硬件资源,目标文件的数量和所述待拆分的源文件的拆分类型确定的正整数,所述服务器的硬件资源包括磁盘类型;
针对所述N个拆分区间中的每一个拆分区间,为该拆分区间指定一个拆分器;其中,所述拆分器用于指代预先创建的拆分线程或拆分进程;
触发每个所述拆分器,使每个所述拆分器对指定的拆分区间进行拆分,得到目标文件。
2.根据权利要求1所述的方法,其特征在于,所述触发每个所述拆分器,使每个所述拆分器对指定的拆分区间进行拆分,得到目标文件之前,还包括:
设置所述拆分器的系统属性。
3.根据权利要求1所述的方法,其特征在于,所述待拆分的源文件的拆分类型包括:有序拆分和无序拆分;
所述N是根据服务器的硬件资源,目标文件的数量和所述待拆分的源文件的拆分类型确定的正整数,包括:
若所述待拆分的源文件的拆分类型是无序拆分,则所述N等于目标文件的数量M,所述M是正整数;
若所述待拆分的源文件的拆分类型是有序拆分,则所述N是大于1,且小于或等于预设阈值的正整数。
4.根据权利要求1所述的方法,其特征在于,所述将所述源文件划分为N个拆分区间,包括:
创建所述源文件的N个指针;其中,所述N个指针都指向所述源文件的第一个位置,所述源文件的每一个字符对应一个位置,所述位置指代对应字符的存储地址;
根据所述源文件的字符数和所述拆分区间的数量N确定拆分间隔;
根据所述拆分间隔移动所述N个指针中的N-1个指针,使所述N个指针分别指向所述源文件中N个不同的位置,且任意两个相邻的指针指向的位置之间的距离为所述拆分间隔,得到由所述指针分隔的N个拆分区间。
5.根据权利要求4所述的方法,其特征在于,所述根据所述拆分间隔移动所述N个指针中的N-1个指针之后,还包括:
调用换行函数,使所述移动过的N-1个指针移动至当前指向的位置的下一行的开始位置,得到由所述指针分隔的N个拆分区间。
6.根据权利要求1所述的方法,其特征在于,所述触发每个所述拆分器,使每个所述拆分器对指定的拆分区间进行拆分,得到目标文件,包括:
若所述待拆分的源文件的拆分类型是无序拆分,则触发每个所述拆分器,使每个所述拆分器对指定的拆分区间进行拆分后,将得到的结果直接写入目标文件;
若所述待拆分的源文件的拆分类型是有序拆分,则触发每个所述拆分器,使每个所述拆分器对指定的拆分区间进行拆分后,将得到的结果写入与所述拆分区间对应的中间文件;并触发预先创建的合并线程或合并进程将所述中间文件合并得到目标文件。
7.一种文件拆分的装置,其特征在于,包括:
获取单元,用于获取待拆分的源文件;
划分单元,用于根据服务器的硬件资源,目标文件的数量和所述待拆分的源文件的拆分类型确定拆分区间的数量N,并将所述源文件划分为N个拆分区间;其中,所述服务器的硬件资源包括磁盘类型;
分配单元,用于针对所述N个拆分区间中的每一个拆分区间,为该拆分区间指定一个拆分器;其中,所述拆分器用于指代预先创建的拆分线程或拆分进程;
触发单元,用于触发每个所述拆分器,使每个所述拆分器对指定的拆分区间进行拆分,得到目标文件。
8.根据权利要求7所述的装置,其特征在于,所述划分单元包括:
确定单元,用于根据服务器的硬件资源,目标文件的数量和所述待拆分的源文件的拆分类型确定拆分区间的数量N,并根据所述源文件的字符数和所述拆分区间的数量N确定拆分间隔;其中,所述服务器的硬件资源包括包括磁盘类型;
创建单元,用于创建所述源文件的N个指针,其中,所述N个指针都指向所述源文件的第一个位置;其中,所述源文件的每一个字符对应一个位置,所述位置指代对应字符的存储地址;
移动单元,用于根据所述拆分间隔移动所述N个指针中的N-1个指针,使所述N个指针分别指向所述源文件中N个不同的位置,且任意两个相邻的指针指向的位置之间的距离为所述拆分间隔,得到由所述指针分隔的N个拆分区间。
9.一种电子设备,其特征在于,包括处理器和存储器;其中:
所述存储器用于存储计算机指令;
所述处理器用于执行所述存储器存储的计算机指令,具体执行如权利要求1至6中任意一项所述的文件拆分的方法。
10.一种存储介质,其特征在于,用于存储程序,所述程序被执行时,用于实现如权利要求1至6中任意一项所述的文件拆分的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910402286.9A CN110109881B (zh) | 2019-05-15 | 2019-05-15 | 文件拆分的方法、装置、电子设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910402286.9A CN110109881B (zh) | 2019-05-15 | 2019-05-15 | 文件拆分的方法、装置、电子设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110109881A true CN110109881A (zh) | 2019-08-09 |
CN110109881B CN110109881B (zh) | 2021-07-30 |
Family
ID=67490157
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910402286.9A Active CN110109881B (zh) | 2019-05-15 | 2019-05-15 | 文件拆分的方法、装置、电子设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110109881B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111625505A (zh) * | 2020-05-26 | 2020-09-04 | 深圳前海微众银行股份有限公司 | 一种文件拆分方法及装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20110072058A1 (en) * | 2008-05-15 | 2011-03-24 | Alibaba Group Holding Limited | Method and System for Large Volume Data Processing |
CN103164667A (zh) * | 2011-12-08 | 2013-06-19 | 三星电子株式会社 | 数据存储设备和数据管理方法 |
CN108304554A (zh) * | 2018-02-02 | 2018-07-20 | 平安证券股份有限公司 | 文件拆分方法、装置、计算机设备和存储介质 |
-
2019
- 2019-05-15 CN CN201910402286.9A patent/CN110109881B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20110072058A1 (en) * | 2008-05-15 | 2011-03-24 | Alibaba Group Holding Limited | Method and System for Large Volume Data Processing |
CN103164667A (zh) * | 2011-12-08 | 2013-06-19 | 三星电子株式会社 | 数据存储设备和数据管理方法 |
CN108304554A (zh) * | 2018-02-02 | 2018-07-20 | 平安证券股份有限公司 | 文件拆分方法、装置、计算机设备和存储介质 |
Non-Patent Citations (2)
Title |
---|
倒骑的驴: "《大文件拆分方案的java实践(附源码)》", 《HTTP://WWW.CNBLOGS.COM/DAOQIDELV/P/6884223.HTML》 * |
菩提树下的杨过: "《java:快速文件分割及合并》", 《HTTP://WWW.CNBLOGS.COM/YJMYZZ/P/HOW-TO-SPLIT-A-LARGE-FILE-INTO-SMALL-FILES-FASTLY.HTML》 * |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111625505A (zh) * | 2020-05-26 | 2020-09-04 | 深圳前海微众银行股份有限公司 | 一种文件拆分方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN110109881B (zh) | 2021-07-30 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110806986B (zh) | 提高网络芯片报文存储效率的方法、设备及存储介质 | |
CN112363763B (zh) | 数据处理方法、装置及计算机可读存储介质 | |
CN110458920A (zh) | 一种笔迹擦除方法及装置 | |
CN105843819B (zh) | 一种数据导出方法及装置 | |
CN106648461A (zh) | 一种内存管理装置和方法 | |
CN103425435B (zh) | 磁盘存储方法及磁盘存储系统 | |
CN104834505A (zh) | 一种多核多线程环境下numa感知的同步方法 | |
CN105718319B (zh) | 一种内存池版图解析方法和内存池装置 | |
CN110704438B (zh) | 一种区块链中布隆过滤器的生成方法及装置 | |
CN109240607B (zh) | 一种文件读取方法和装置 | |
CN105528371B (zh) | 一种执行写任务的方法、装置及系统 | |
CN104183267A (zh) | 数据处理设备和存储器设备 | |
CN110109881A (zh) | 文件拆分的方法、装置、电子设备及存储介质 | |
CN112085644A (zh) | 多列数据排序方法、装置、可读存储介质和电子设备 | |
CN106951168B (zh) | 一种文字处理方法及移动终端 | |
CN111625507A (zh) | 一种文件处理方法及装置 | |
CN109800074A (zh) | 任务数据并发执行方法、装置以及电子设备 | |
CN111159124B (zh) | Linux内核文件系统异步写缓存方法、装置及介质 | |
WO2023060833A1 (zh) | 数据交互方法、电子设备、存储介质 | |
CN109033438A (zh) | 一种记录用户学习内容的方法及装置 | |
CN106782668B (zh) | 一种测试内存读写极限速度的方法及装置 | |
CN112035380B (zh) | 一种数据处理方法、装置、设备及可读存储介质 | |
CN104268013B (zh) | 一种快速的全系统模拟器确定性回放方法 | |
CN107291483A (zh) | 智能删除应用程序的方法及电子设备 | |
CN109144977A (zh) | 一种数据迁移方法、装置、设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |