文件拆分的方法、系统和存储介质与流程

文档序号:28530652发布日期:2022-01-19 12:37阅读:63来源:国知局
文件拆分的方法、系统和存储介质与流程

1.本技术涉及计算机技术领域,特别是涉及文件拆分的方法、系统和存储介质。


背景技术:

2.计算机运行时,由于存储介质的容量限制和网络传输能力限制等原因,需要对数据量较大的源文件进行拆分,也就是将源文件中的数据分别保存为多个数据量较小的拆分文件,以方便存储或传输。在相关技术中,可以通过逐行读取,不断的创建、关闭文件输出流对源文件进行拆分,但频繁的创建、关闭文件输出流,会导致性能低下,源文件拆分效率低;
3.目前针对相关技术中对源文件的拆分需要频繁的创建、关闭文件输出流,导致源文件拆分效率低的问题,尚未提出有效的解决方案。


技术实现要素:

4.本技术实施例提供了一种文件拆分的方法、系统和存储介质,以至少解决相关技术中对源文件的拆分需要频繁的创建、关闭文件输出流,导致源文件拆分效率低的问题。
5.第一方面,本技术实施例提供了一种文件拆分的方法,所述方法包括:
6.获取待拆分的源文件中每一行数据的关键数据;
7.根据所述源文件中每一行数据的关键数据,从map容器中获取对应的文件输出流对象对所述源文件进行拆分,直至拆分完所述源文件,其中,所述map容器为文件输出流对象池,用于存储文件输出流对象。
8.在其中一些实施例中,所述获取待拆分的源文件中每一行数据的关键数据之前,所述方法还包括:
9.创建map容器;
10.获取待拆分的源文件中每一行数据的关键数据,根据关键数据类型的数量创建同等数量的文件输出流对象,并将所述文件输出流对象与所述关键数据按映射关系保存到所述map容器。
11.在其中一些实施例中,所述根据关键数据类型的数量创建同等数量的文件输出流对象,并将所述文件输出流对象与所述关键数据按映射关系保存到所述map容器包括:
12.读取源文件中当前行数据的关键数据,判断所述关键数据是否存在于所述map容器中;
13.若判断结果为否,则创建文件输出流对象,将新创建的文件输出流对象以及对应的关键数据按映射关系保存到所述map容器;
14.若判断结果为是,则获取源文件中下一行数据的关键数据,并判断所述关键数据是否存在于所述map容器中,根据判断结果重复上一执行步骤,直至读取完所述源文件。
15.在其中一些实施例中,根据所述源文件中每一行数据的关键数据,从map容器中获取对应的文件输出流对象对所述源文件进行拆分包括:
16.读取源文件中当前行数据的关键数据,判断所述关键数据是否存在于所述map容
器中;
17.若判断结果为是,则获取所述关键数据对应的文件输出流对象,通过所述文件输出流对象将当前行数据写入到对应的拆分文件中;
18.若判断结果为否,则创建文件输出流对象,通过新创建的文件输出流对象将当前行数据写入到对应的拆分文件中,并将新创建的文件输出流对象以及对应的关键数据按映射关系保存到所述map容器;
19.获取源文件中下一行数据的关键数据,并判断所述关键数据是否存在于所述map容器中,根据判断结果重复上一执行步骤,直至拆分完所述源文件。
20.在其中一些实施例中,将新创建的文件输出流对象以及对应的关键数据按映射关系保存到所述map容器之前,所述方法还包括:
21.在所述map容器中文件输出流对象的数量达到预设数量阈值的情况下,关闭所述新创建的文件输出流对象,或更新所述map容器中的文件输出流对象。
22.在其中一些实施例中,在获取不到源文件中行数据的关键数据的情况下,所述方法还包括:
23.将获取不到关键数据的行数据记为目标行数据,为所述目标行数据创建目标文件输出流对象。
24.在其中一些实施例中,拆分完所述源文件之后,所述方法还包括:遍历所述map容器,关闭所述map容器中所有文件输出流对象。
25.在其中一些实施例中,获取所述源文件中每一行数据的关键数据包括:
26.根据所述源文件的格式,构造正则表达式,通过所述正则表达式获取每一行数据中的关键数据。
27.第二方面,本技术实施例提供了一种文件拆分的系统,所述系统包括获取模块和拆分模块,
28.所述获取模块,用于获取待拆分的源文件中每一行数据的关键数据;
29.所述拆分模块,用于根据所述源文件中每一行数据的关键数据,从map容器中获取对应的文件输出流对象对所述源文件进行拆分,其中,所述map容器为文件输出流对象池,用于存储文件输出流对象。
30.第三方面,本技术实施例提供了一种存储介质,其上存储有计算机程序,该程序被处理器执行时实现如上述第一方面所述的文件拆分的方法。
31.相比于相关技术,本技术实施例提供的文件拆分的方法,通过获取待拆分的源文件中每一行数据的关键数据;根据源文件中每一行数据的关键数据,从map容器中获取对应的文件输出流对象对源文件进行拆分,其中,map容器为文件输出流对象池,用于存储文件输出流对象,在拆分源文件时,无需频繁的创建、关闭文件输出流对象,提高了源文件拆分的效率。
附图说明
32.此处所说明的附图用来提供对本技术的进一步理解,构成本技术的一部分,本技术的示意性实施例及其说明用于解释本技术,并不构成对本技术的不当限定。在附图中:
33.图1是根据本技术实施例的文件拆分的方法的流程图;
34.图2是根据本技术实施例的文件拆分的方法的示意图;
35.图3是根据本技术实施例的另一种文件拆分的方法的示意图;
36.图4是根据本技术实施例的文件拆分的系统的结构框图。
具体实施方式
37.为了使本技术的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本技术进行描述和说明。应当理解,此处所描述的具体实施例仅仅用以解释本技术,并不用于限定本技术。基于本技术提供的实施例,本领域普通技术人员在没有作出创造性劳动的前提下所获得的所有其他实施例,都属于本技术保护的范围。此外,还可以理解的是,虽然这种开发过程中所作出的努力可能是复杂并且冗长的,然而对于与本技术公开的内容相关的本领域的普通技术人员而言,在本技术揭露的技术内容的基础上进行的一些设计,制造或者生产等变更只是常规的技术手段,不应当理解为本技术公开的内容不充分。
38.在本技术中提及“实施例”意味着,结合实施例描述的特定特征、结构或特性可以包含在本技术的至少一个实施例中。在说明书中的各个位置出现该短语并不一定均是指相同的实施例,也不是与其它实施例互斥的独立的或备选的实施例。本领域普通技术人员显式地和隐式地理解的是,本技术所描述的实施例在不冲突的情况下,可以与其它实施例相结合。
39.除非另作定义,本技术所涉及的技术术语或者科学术语应当为本技术所属技术领域内具有一般技能的人士所理解的通常意义。本技术所涉及的“一”、“一个”、“一种”、“该”等类似词语并不表示数量限制,可表示单数或复数。本技术所涉及的术语“包括”、“包含”、“具有”以及它们任何变形,意图在于覆盖不排他的包含;例如包含了一系列步骤或模块(单元)的过程、方法、系统、产品或设备没有限定于已列出的步骤或单元,而是可以还包括没有列出的步骤或单元,或可以还包括对于这些过程、方法、产品或设备固有的其它步骤或单元。本技术所涉及的“连接”、“相连”、“耦接”等类似的词语并非限定于物理的或者机械的连接,而是可以包括电气的连接,不管是直接的还是间接的。本技术所涉及的“多个”是指大于或者等于两个。“和/或”描述关联对象的关联关系,表示可以存在三种关系,例如,“a和/或b”可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。本技术所涉及的术语“第一”、“第二”、“第三”等仅仅是区别类似的对象,不代表针对对象的特定排序。
40.本实施例提供了一种文件拆分的方法,图1是根据本技术实施例的文件拆分的方法的流程图,如图1所示,该方法包括如下步骤:
41.步骤s101,获取待拆分的源文件中每一行数据的关键数据;本实施例中,创建一个文件输入流并通过bufferreader逐行读取源文件,并获取每一行数据的关键数据,其中,关键数据可以为每行数据中的唯一标识符,例如用户id,根据用户id对源文件进行拆分,示例性的,源文件中包含10个用户id,则根据用户id将源文件的数据对应拆分到10个拆分文件中。
42.步骤s102,根据源文件中每一行数据的关键数据,从map容器中获取对应的文件输出流对象对源文件进行拆分,其中,map容器为文件输出流对象池,用于存储文件输出流对象。本实施例中,可以预先根据源文件中每一行数据的关键数据创建好对应的文件输出流对象,并保存在map容器中,再根据源文件中每一行数据的关键数据,从map容器中获取对应
的文件输出流对象对源文件进行拆分。
43.在相关技术中,由于同样的关键数据在源文件的每行数据中并不是连续的,且一个文件输出流对象只能将数据写到同一个拆分文件中,故对源文件进行拆分时,需要频繁的创建、关闭文件输出流对象,导致源文件拆分效率低。
44.例如,源文件中第一行和第二行为a用户的数据,第三行为b用户的数据,第四行为a用户的数据,则创建第一个文件输出流对象将第一行数据和第二行数据写入到a拆分文件后,需要关闭第一个文件输出流对象,创建第二个文件输出流对象将第三行数据写入到b拆分文件,再关闭第二个文件输出流对象,并创建第三个文件输出流对象将第四行数据写入到a拆分文件,再关闭第三个文件输出流对象,由于源文件中用户id的数量较多,且同样的用户id在源文件的每行数据中的顺序几乎是打乱的,故需要频繁的创建、关闭文件输出流对象才能拆分完源文件。
45.而本技术的技术方案中,通过步骤s101至步骤s102,预先根据源文件中每一行数据的关键数据创建好对应的文件输出流对象,并保存在map容器中,再对源文件进行拆分时,获取待拆分的源文件中每一行数据的关键数据,从map容器中获取对应的文件输出流对象,根据文件输出流对象将当前行数据写到对应的拆分文件中,直至拆分完源文件,无需频繁的创建、关闭文件输出流对象,提高了源文件拆分的效率。
46.示例性的,源文件中第一行和第二行为a用户的数据,第三行为b用户的数据,第四行为a用户的数据,则为a用户创建文件输出流对象a,为b用户创建文件输出流对象b,并保存在map容器中,对源文件进行拆分时,获取第一行数据的关键数据为a用户,则从map容器中获取文件输出流对象a将第一行数据写入到对应的a拆分文件中,获取第二行数据的关键数据也为a用户,则继续通过文件输出流对象a将第二行数据写入到a拆分文件中,获取第三行数据的关键数据为b用户,则将文件输出流对象a保存回map容器中,并从map容器中获取文件输出流对象b将第三行数据写入到对应的b拆分文件中,获取第四行数据的关键数据为a用户,则从map容器中获取文件输出流对象a将第四行数据写入到a拆分文件中,直至拆分完该源文件。
47.在其中一些实施例中,获取待拆分的源文件中每一行数据的关键数据之前,创建map容器;
48.获取待拆分的源文件中每一行数据的关键数据,根据关键数据类型的数量创建同等数量的文件输出流对象,并将文件输出流对象与关键数据按映射关系保存到map容器;其中,key为关键数据,value为文件输出流对象,以key-value的形式将文件输出流对象与关键数据一一对应的保存到map容器。
49.可选的,保存在map容器中的文件输出流对象与关键数据的映射关系可以是一对一的关系,也可以是多对一的关系,示例性的,当关键数据为用户id,且源文件中第一行为a用户的数据,第二行为b用户的数据,第三行为c用户的数据时,若要将a用户和b用户的数据拆分到同一个第一拆分文件中,c用户的数据拆分到另一个第二拆分文件中,则a用户和b用户的用户id为一个类型的关键数据,c用户的用户id为另一个类型的关键数据,为a用户和b用户创建第一文件输出流对象,为c用户创建第二文件输出流对象,并保存在map容器中,对该源文件进行拆分时,获取第一行数据的关键数据为a用户,则从map容器中获取第一文件输出流对象将第一行数据写入到对应的第一拆分文件中,获取第二行数据的关键数据为b
用户,则继续通过第一文件输出流对象将第一行数据写入到对应的第一拆分文件中,获取第三行数据的关键数据为c用户,则将第一文件输出流对象保存回map容器中,并从map容器中获取第二文件输出流对象将第三行数据写入到对应的第二拆分文件中,直至拆分完该源文件。
50.本实施例中,关键数据类型的数量即为拆分文件的数量,也即所需的文件输出流对象的数量,例如,关键数据为用户id时,源文件包含a用户和b用户的数据,则说明关键数据类型的数量为2,则至少创建2个文件输出流对象,以使得有足够的文件输出流对象对源文件进行拆分。
51.在其中一些实施例中,根据关键数据类型的数量创建同等数量的文件输出流对象,并将文件输出流对象与关键数据按映射关系保存到map容器包括:
52.读取源文件中当前行数据的关键数据,判断该关键数据是否存在于map容器中,若判断结果为否,则创建文件输出流对象,将新创建的文件输出流对象以及对应的关键数据按映射关系保存到map容器;若判断结果为是,则获取源文件中下一行数据的关键数据,并判断关键数据是否存在于map容器中,根据判断结果重复上一执行步骤,直至读取完源文件。通过本实施例,为源文件中的关键数据对应创建好所需的文件输出流对象,并将文件输出流对象与对应的关键数据按映射关系保存到map容器。
53.在其中一些实施例中,图2是根据本技术实施例的文件拆分的方法的示意图,如图2所示,根据源文件中每一行数据的关键数据,从map容器中获取对应的文件输出流对象对源文件进行拆分包括如下步骤:
54.步骤s201,读取源文件中当前行数据的关键数据;
55.步骤s202,判断关键数据是否存在于map容器中,若是,则跳转到步骤s203,若否,则跳转到步骤s204;
56.步骤s203,获取关键数据对应的文件输出流对象,通过文件输出流对象将当前行数据写入到对应的拆分文件中;
57.步骤s204,创建文件输出流对象,通过新创建的文件输出流对象将当前行数据写入到对应的拆分文件中,并将新创建的文件输出流对象以及对应的关键数据按映射关系保存到map容器;
58.步骤s205,判断是否有下一行数据,若是,则跳转到步骤s206,若否,则跳转到步骤s207;
59.步骤s206,获取下一行数据的关键数据;
60.步骤s207,结束,即拆分完源文件。
61.相对于相关技术中,对源文件进行拆分时,需要频繁的创建、关闭文件输出流对象,导致源文件拆分效率低,本技术的技术方案中,通过步骤s201至步骤s207,在map容器中保存有关键数据对应的文件输出流对象时,直接获取该文件输出流对象,通过该文件输出流对象将行数据写入到对应的拆分文件中,在map容器中没有保存关键数据对应的文件输出流对象时,创建文件输出流对象,并将新创建的文件输出流对象以及对应的关键数据按映射关系保存到map容器中,无需要频繁的创建、关闭文件输出流对象,提高了源文件拆分的效率。
62.在其中一些实施例中,将新创建的文件输出流对象以及对应的关键数据按映射关
系保存到map容器之前,在map容器中文件输出流对象的数量达到预设数量阈值的情况下,关闭新创建的文件输出流对象,或更新map容器中的文件输出流对象。本实施例中,预设数量阈值可以设置为map容器最大可以存储的文件输出流对象的数量,限制map容器最大存储的数量,可以防止map容器中保存的文件输出流对象过多而导致内存溢出。
63.示例性的,map容器最大存储的预设数量阈值为50个,源文件中包含53个用户的数据,则创建到第49个文件输出流对象时,文件输出流对象的数量没有达到map容器最大存储的预设数量阈值,在创建第50个文件输出流对象时,文件输出流对象的数量达到预设数量阈值,则通过第50个文件输出流对象将对应的行数据写入到拆分文件后,关闭该第50个文件输出流对象;或者更新map容器中的文件输出流对象,例如,查找map容器中使用频率最低的文件输出流对象,关闭该使用频率最低的文件输出流对象,再将第50个文件输出流对象保存到map容器中,又例如,按先进先出的方式关闭第1个保存到map容器中的文件输出流对象,再将第50个文件输出流对象保存到map容器中。
64.在相关技术中,可以通过将整个源文件一次性读入内存中,再统一创建文件输出流对源文件进行拆分,提高源文件拆分的效率,但内存占用太大,极易导致内存溢出,而本实施例中,将文件输出流对象保存在map容器中,并限制map容器最大存储的容量,可以在提高源文件拆分效率的同时防止内存溢出。
65.在其中一些实施例中,在获取不到源文件中行数据的关键数据的情况下,将获取不到关键数据的行数据记为目标行数据,为目标行数据创建目标文件输出流对象。本实施例中,将目标行数据统一拆分到一个拆分文件中,在读取到目标行数据时,从map容器中获取目标文件输出流对象,通过目标文件输出流对象将目标行数据写入到对应的拆分文件。
66.在其中一些实施例中,拆分完源文件之后,遍历map容器,关闭map容器中所有文件输出流对象。本实施例中,为源文件创建的map容器一般只适用于该源文件,故拆分完源文件之后,关闭map容器中的所有文件输出流对象,减少内存的占用。
67.在其中一些实施例中,获取源文件中每一行数据的关键数据包括:根据源文件的格式,构造正则表达式,通过该正则表达式获取每一行数据中的关键数据。本实施例中,根据源文件的格式,可以得知关键数据所在行数据中的位置,根据关键数据所在行数据中的位置,构造正则表达式获取每一行数据中的关键数据。
68.在其中一些实施例中,图3是根据本技术实施例的另一种文件拆分的方法的示意图,如图3所示,该方法包括如下步骤:
69.步骤s301,程序开始;
70.步骤s302,创建文件输入流,其中,文件输入流用于读取源文件;
71.步骤s303,创建保存文件输出流对象的map容器,其中,key为从每一行数据中获取的关键数据,如userid、activityid等;
72.步骤s304,通过文件输入流读取源文件;
73.步骤s305,判断是否有下一行,若否,则跳转到步骤s306,若是,则跳转到步骤s307;
74.步骤s306,程序结束;
75.步骤s307,获取行数据的关键数据key;
76.步骤s308,判断map容器中是否已存在该关键数据key,若是,则跳转到步骤s309,
若否,则跳转到步骤s310;
77.步骤s309,获取关键数据key对应的文件输出流对象,通过文件输出流对象将当前的行数据对应写入到拆分文件中;
78.步骤s310,创建关键数据key对应的文件输出流对象;
79.步骤s311,通过新创建的文件输出流对象将当前的行数据对应写入到拆分文件中;
80.步骤s312,判断文件输出流对象的数量是否大于预设数量阈值,若是,则跳转到步骤s313,若否,则跳转到步骤s314;
81.步骤s313,关闭文件输出流对象,并跳转至步骤s305;
82.步骤s314,将key-value存入到容器map中,key为关键数据,value为文件输出流对象,并跳转至步骤s305。
83.通过了上述步骤s301至步骤s314,在拆分源文件时,无需频繁的创建、关闭文件输出流对象,提高源文件的拆分效率,并通过限制map容器最大存储的容量,防止内存溢出。
84.需要说明的是,在上述流程中或者附图的流程图中示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
85.本实施例还提供了一种文件拆分的系统,该系统用于实现上述实施例及优选实施方式,已经进行过说明的不再赘述。如以下所使用的,术语“模块”、“单元”、“子单元”等可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。
86.图4是根据本技术实施例的文件拆分的系统的结构框图,如图4所示,该系统包括获取模块41和拆分模块42,获取模块41用于获取待拆分的源文件中每一行数据的关键数据;拆分模块42用于根据源文件中每一行数据的关键数据,从map容器中获取对应的文件输出流对象对源文件进行拆分,其中,map容器为文件输出流对象池,用于存储文件输出流对象,在拆分源文件时,无需频繁的创建、关闭文件输出流对象,提高了源文件的拆分效率。
87.需要说明的是,上述各个模块可以是功能模块也可以是程序模块,既可以通过软件来实现,也可以通过硬件来实现。对于通过硬件来实现的模块而言,上述各个模块可以位于同一处理器中;或者上述各个模块还可以按照任意组合的形式分别位于不同的处理器中。
88.本实施例还提供了一种电子装置,包括存储器和处理器,该存储器中存储有计算机程序,该处理器被设置为运行计算机程序以执行上述任一项方法实施例中的步骤。
89.可选地,上述电子装置还可以包括传输设备以及输入输出设备,其中,该传输设备和上述处理器连接,该输入输出设备和上述处理器连接。
90.需要说明的是,本实施例中的具体示例可以参考上述实施例及可选实施方式中所描述的示例,本实施例在此不再赘述。
91.另外,结合上述实施例中的文件拆分的方法,本技术实施例可提供一种存储介质来实现。该存储介质上存储有计算机程序;该计算机程序被处理器执行时实现上述实施例中的任意一种文件拆分的方法。
92.在一个实施例中,提供了一种计算机设备,该计算机设备可以是终端。该计算机设
备包括通过系统总线连接的处理器、存储器、网络接口、显示屏和输入装置。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统和计算机程序。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种文件拆分的方法。该计算机设备的显示屏可以是液晶显示屏或者电子墨水显示屏,该计算机设备的输入装置可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。
93.本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,该计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本技术所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(rom)、可编程rom(prom)、电可编程rom(eprom)、电可擦除可编程rom(eeprom)或闪存。易失性存储器可包括随机存取存储器(ram)或者外部高速缓冲存储器。作为说明而非局限,ram以多种形式可得,诸如静态ram(sram)、动态ram(dram)、同步dram(sdram)、双数据率sdram(ddrsdram)、增强型sdram(esdram)、同步链路(synchlink)dram(sldram)、存储器总线(rambus)直接ram(rdram)、直接存储器总线动态ram(drdram)、以及存储器总线动态ram(rdram)等。
94.本领域的技术人员应该明白,以上所述实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
95.以上所述实施例仅表达了本技术的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本技术构思的前提下,还可以做出若干变形和改进,这些都属于本技术的保护范围。因此,本技术专利的保护范围应以所附权利要求为准。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1