CN111444149A - 一种数据导入方法、装置、设备及存储介质 - Google Patents
一种数据导入方法、装置、设备及存储介质 Download PDFInfo
- Publication number
- CN111444149A CN111444149A CN202010312564.4A CN202010312564A CN111444149A CN 111444149 A CN111444149 A CN 111444149A CN 202010312564 A CN202010312564 A CN 202010312564A CN 111444149 A CN111444149 A CN 111444149A
- Authority
- CN
- China
- Prior art keywords
- data
- thread
- memory
- threads
- 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.)
- Pending
Links
Images
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
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/10—File systems; File servers
- G06F16/11—File system administration, e.g. details of archiving or snapshots
- G06F16/113—Details of archiving
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Human Computer Interaction (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供一种数据导入方法、装置、设备及存储介质,属于计算机技术领域。该方法包括:确定外存中预先指定的源文件的大小;根据预设的并发线程数以及源文件的大小,对源文件进行分割,得到多个数据分片,每个数据分片对应一个线程;采用并发线程数对应的多个线程,分别读取对应的数据分片,并将读取到的数据导入内存。实现了多个线程并发将源文件导入内存,缩短了源文件导入内存所用的时间,提高了源文件导入内存的效率。
Description
技术领域
本发明涉及计算机技术领域,具体而言,涉及一种数据导入方法、装置、设备及存储介质。
背景技术
随着计算机、网络、内存相关技术的综合发展,源文件导入内存的效率直接影响了操作系统的响应速度及用户体验。
现有的源文件导入内存时,采用单线程将源文件导入内存,具体指的是1个线程去执行写的操作,其他线程都无法同时进行读或写的操作。
但是,采用单线程将源文件导入内存时,前一个线程需要完成读写操作后,当前线程才可以进行读写操作,源文件导入内存浪费大量的时间,导致源文件导入内存的效率低。
发明内容
本发明的目的在于提供一种数据导入方法、装置、设备及存储介质,可以解决上述源文件导入内存效率低的问题。
本发明的实施例是这样实现的:
本发明实施例的一方面,提供一种数据导入方法,包括:
确定外存中预先指定的源文件的大小;
根据预设的并发线程数以及所述源文件的大小,对所述源文件进行分割,得到多个数据分片,每个数据分片对应一个线程;
采用所述并发线程数对应的多个线程,分别读取对应的数据分片,并将读取到的数据导入内存。
可选的,所述确定外存中预先指定的源文件的大小,包括:
在文件系统中对所述源文件进行定位,并执行所述源文件的打开操作,所述文件系统中的文件以预设的数据结构存储在外存中;
通过预设的文件操作接口,对所述源文件进行处理,确定所述源文件的大小。
可选的,所述根据预设的并发线程数,以及所述源文件的大小,对所述源文件进行分割之前,所述方法还包括:
根据操作系统所支持的线程数,以及计算节点的数量,确定所述并发线程数。
可选的,所述源文件的大小包括所述源文件的行数,或,字节数量。
可选的,所述采用所述并发线程数对应的多个线程,分别读取对应的数据分片,并将读取到的数据导入内存,包括:
判断所述每个线程对应的数据分片的起止点是否在一行数据的中间位置;
若所述多个线程中第一线程对应的数据分片的起止点在一行数据的中间位置,则对所述第一线程对应的数据分片进行重定位;
采用所述第一线程,对重定位后的所述第一线程对应的数据分片进行读取操作,并将读取到的数据导入内存。
可选的,所述对所述第一线程对应的数据分片进行重定位,包括:
将向前寻址的行首作为重定位后所述第一线程对应的数据分片的起点。
可选的,所述对所述第一线程对应的数据分片进行重定位,包括:
将向后寻址的行末作为重定位后所述第一线程对应的数据分片的终点;
所述采用所述并发线程数对应的多个线程,分别将对应的数据分片导入内存,还包括:
将下一行的行首作为重定位后的第二线程对应的数据分片的起点,所述第二线程为所述第一线程的下一线程;
采用所述第一线程,将重定位后的所述第二线程对应的数据分片,导入内存。
可选的,所述采用所述并发线程数对应的多个线程,分别读取对应的数据分片,包括:
采用所述每个线程,以分隔符对所述每个线程对应的数据分片中的每行数据进行分解,并对分解到的所述每行数据对应的多个数据项进行读取操作。
可选的,所述将读取到的数据导入内存,包括:
若读取到的数据为非整形数据,将所述读取到的数据进行整形化处理后导入内存。
可选的,所述将读取到的数据导入内存,包括:
将读取到的数据以哈希表结构存储在内存中,所述哈希表结构中多个键值对应同一个存储空间的位置,所述多个键值通过链表的方式挂载在所述存储空间中进行存储。
可选的,所述方法还包括:
采用所述多个线程,对所述内存中所述多个线程的访问键值对应的存储空间的数据进行访问操作。
可选的,所述方法还包括:
若所述内存中一个存储空间对应的键值为多个,则将多个键值对应的存储空间的数据预加载至缓存中。
本申请实施例另一方面,还提供一种数据导入装置,包括:
确定模块,用于确定外存中预先指定的源文件的大小;
分割模块,用于根据预设的并发线程数以及所述源文件的大小,对所述源文件进行分割,得到多个数据分片,每个数据分片对应一个线程;
导入模块,用于采用所述并发线程数对应的多个线程,分别读取对应的数据分片,并将读取到的数据导入内存。
可选的,所述确定模块,具体用于在文件系统中对所述源文件进行定位,并执行所述源文件的打开操作,所述文件系统中的文件以预设的数据结构存储在外存中;通过预设的文件操作接口,对所述源文件进行处理,确定所述源文件的大小。
可选的,所述确定模块,还用于根据操作系统所支持的线程数,以及计算节点的数量,确定所述并发线程数。
可选的,所述源文件的大小包括所述源文件的行数,或,字节数量。
可选的,所述导入模块,具体用于判断所述每个线程对应的数据分片的起止点是否在一行数据的中间位置;若所述多个线程中第一线程对应的数据分片的起止点在一行数据的中间位置,则对所述第一线程对应的数据分片进行重定位;采用所述第一线程,对重定位后的所述第一线程对应的数据分片进行读取操作,并将读取到的数据导入内存。
可选的,所述导入模块,具体用于将向前寻址的行首作为重定位后所述第一线程对应的数据分片的起点。
可选的,所述导入模块,具体用于将向后寻址的行末作为重定位后所述第一线程对应的数据分片的终点;
所述导入模块,还用于将下一行的行首作为重定位后的第二线程对应的数据分片的起点,所述第二线程为所述第一线程的下一线程;采用所述第二线程,将重定位后的所述第二线程对应的数据分片,导入内存。
可选的,所述导入模块,具体用于采用所述每个线程,以分隔符对所述每个线程对应的数据分片中的每行数据进行分解,并对分解到的所述每行数据对应的多个数据项进行读取操作。
可选的,所述导入模块,具体用于若读取到的数据为非整形数据,将所述读取到的数据进行整形化处理后导入内存。
可选的,所述导入模块,具体用于将读取到的数据以哈希表结构存储在内存中,所述哈希表结构中多个键值对应同一个存储空间的位置,所述多个键值通过链表的方式挂载在所述存储空间中进行存储。
可选的,所述装置还包括:
访问模块,用于采用所述多个线程,对所述内存中所述多个线程的访问键值对应的存储空间的数据进行访问操作。
可选的,所述装置还包括:
加载模块,用于若所述内存中一个存储空间对应的键值为多个,则将多个键值对应的存储空间的数据预加载至缓存中。
本申请实施例还提供一种计算机设备,包括:存储器、处理器,所述存储器中存储有可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时,实现上述所述的一种数据导入方法的步骤。
本申请实施例还提供一种存储介质,所述存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述所述的一种数据导入方法的步骤。
本发明实施例的有益效果包括:
本发明实施例提供的一种数据导入方法、装置、设备及存储介质,通过确定外存中预先指定的源文件的大小;根据预设的并发线程数以及源文件的大小,对源文件进行分割,得到多个数据分片,每个数据分片对应一个线程;采用并发线程数对应的多个线程,分别读取对应的数据分片,并将读取到的数据导入内存。通过根据预设的并发线程数以及源文件的大小对源文件进行分割,使得每一个数据分片对应一个线程,采用并发线程数对应多个线程,并分别读取对应的数据分片,将读取到数据分片导入内存,实现了多个线程并发将源文件导入内存,缩短了源文件导入内存所用的时间,提高了源文件导入内存的效率。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本发明的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1为本发明一实施例提供的计算机设备的结构示意图;
图2为本发明又一实施例提供的数据导入方法的流程示意图;
图3为本发明另一实施例提供的数据导入方法的流程示意图;
图4为本发明另一实施例提供的源文件的数据结构示意图;
图5为本发明又一实施例提供的源文件的数据结构示意图;
图6为本发明另一实施例提供的内存、图数据结构示意图;
图7为本发明另一实施例提供的数据导入方法的流程示意图;
图8为本发明另一实施例提供的数据导入方法流程示意图;
图9为本申请又一实施例提供的一种数据导入装置的结构示意图;
图10为本申请又一实施例提供的一种数据导入装置的结构示意图。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本申请实施例的组件可以以各种不同的配置来布置和设计。
因此,以下对在附图中提供的本申请的实施例的详细描述并非旨在限制要求保护的本申请的范围,而是仅仅表示本申请的选定实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
在本申请的描述中,需要说明的是,术语“第一”、“第二”、“第三”等仅用于区分描述,而不能理解为指示或暗示相对重要性。
图1为本发明一实施例提供的计算机设备的结构示意图,如图1所示,该计算机设备包括:存储器101、处理器102,存储器101和处理器102通过总线连接。计算机设备上可安装有预设的操作系统,以及数据导入程序。该操作系统以及数据导入程序的数据可存储于该存储器101中。
其中,处理器102通过调用存储器101中存储的数据导入程序,以执行下述任一方法实施例,实现从外存到内存的数据导入。
需要说明的是,本申请的技术方案应用领域包括:实时图数据库、内存数据库。在上述应用领域之上,更多的应用场景可以被满足,例如:知识图谱、问答系统、推荐系统、专家系统等应用场景,在基础的数据库应用场景中,数据加载是一个最核心也是最初的一个步骤,具体通过对批量的数据加载,让数据库内填充数据。
如下通过多个实施例为计算机设备所执行的数据导入方法进行解释说明。
图2为本发明又一实施例提供的数据导入方法的流程示意图,该方法包括:
S201、确定外存中预先指定的源文件的大小。
其中,源文件的大小可以用源文件的长度表示,源文件大小可以包括:源文件的行数,或字节数量。预先指定的源文件可以为文件系统中的预设文件路径对应的源文件。文件系统中的每个文件均存储在外存中。该文件系统可以为该计算机设备所安装的操作系统中的文件管理系统。
在具体的应用中,可先基于预设到的文件路径,从外存中确定该源文件,继而确定该源文件的大小。该源文件的大小可用于表示该源文件的存储数据量。
需要说明的是,源文件是数据集的一种类型,数据集还包括:数据流等其它类型数据集,数据集的大小可以用字节数量来表达,其它类型的数据集导入内存的方式与源文件导入内存的方式一致,均可以实现高并发方式导入内存。
S202、根据预设的并发线程数以及源文件的大小,对源文件进行分割,得到多个数据分片,每个数据分片对应一个线程。
其中,该预设的并发线程数可以为预先设定的固定的并发线程数,也可以为在对源文件进行分割之前,动态计算的并发线程数,或从操作系统中实时获取并发线程数,也可以为其它方式得到的并发线程数。
该并发线程数还可称为并发资源数,可用于指示该计算机设备的处理器可以同时运行的线程数,或者,同时调用的资源数。
在一种可能的示例中,可根据预设的并发线程数以及源文件的大小,对源文件进行平均分割,得到多个数据分片。
举例来说,若预设的并发线程数为K,源文件的大小为N,则每一数据分片的大小为N/K,对应的每一线程可以分配的数据分片大小则可以为N/K。
例如:若第1个线程从第1行开始,其所获得的数据分片为:第1至第(N/K)行;第P(P>=1)个线程的起始与终止位置为:(P-1)*(N/K)+1至P*(N/K)行。最后一个线程的对应的就是源文件中的第(N–(N/K)+1)至第N行,其中,P指的是当前线程的行数。
需要说明的是,预设的并发资源量取决操作系统所提供的并发资源量,该并发资源量取决于底层系统的可计算资源量以及其它相关参数,其中可计算资源量>=2,可计算资源量的最大受限于物理上限。
S203、采用并发线程数对应的多个线程,分别读取对应的数据分片,并将读取到的数据导入内存。
具体地,多个线程中的每一线程分别读取源文件中的数据,分别将对应的数据分片导入内存数据中。
本发明实施例提供的一种数据导入方法,通过确定外存中预先指定的源文件的大小;根据预设的并发线程数以及源文件的大小,对源文件进行分割,得到多个数据分片,每个数据分片对应一个线程;采用并发线程数对应的多个线程,分别读取对应的数据分片,并将读取到的数据导入内存。通过根据预设的并发线程数以及源文件的大小对源文件进行分割,使得每一个数据分片对应一个线程,采用并发线程数对应多个线程,并分别读取对应的数据分片,将读取到数据分片导入内存,实现了多个线程并发将源文件导入内存,缩短了源文件导入内存所用的时间,提高了源文件导入内存的效率。
图3为本发明另一实施例提供的数据导入方法的流程示意图,上述S201包括:
S2011、在文件系统中对源文件进行定位,并执行源文件的打开操作。
基于预设的文件路径,在文件系统中对源文件进行定位;其中,文件系统中的源文件以预设的数据结构存储在外存中,预设的数据结构可以包括:图数据结构。源文件中的每一行数据以图数据结构存储。图数据结构中最基础的有3大类,第一类是顶点;第二类是边,第三类是路径,这三类数据结构可以排列,组合出任何其它更复杂的数据类型,并可以构造出一张完整的图。而这3类数据中的前2类:顶点和边也可以构成路径,因此我们在源文件中,一般存储的数据为这2类数据。
需要说明的是,文件中的每一行的数据以图数据结构存储具体可以是每一行至少存在一条点或边的数据,每条点数据至少存在一个顶点的id(Identity document,身份标识号),可以存储当前顶点的多个属性信息,顶点的属性信息包括:顶点的名称、顶点的id等属性;每条边数据至少存在一个出发的顶点和一个终止的顶点,每条边可以存储该条边上的多个属性信息,边的属性可以包括:边的名称、边的id、边的方向等属性。
源文件的类型有两种,第一种,参考图4,顶点文件:顶点文件为多行,每一行存放一个顶点相关的全部数据,每一行存在多项(字段)数据,项与项之间可以通过分隔符区分,第一列为顶点的id,用来区分顶点;第二种,参考图5,边文件:边文件多行,每一行存放一条边相关的全部数据,每一行存在多项数据,项与项之间通过分隔符分隔,第一列为边的起始顶点的id,第二列为终止顶点的id,这两个id可以标识当前行所表达的边以及边的方向,若还存在边的属性,则后续的项内可以存储相关属性值。每一顶点的id的数据结构可以是任意类型,例如:整数、字符串、十进制或者十六进制格式的数据结构。顶点具有唯一性,因此在顶点文件中重复出现的顶点的id可以采用自动覆盖或者忽略的方式来处理。边文件中任意一条边的确定因素除起始、终止顶点外,还包括其全部属性,边的属性字段(id)的数据结构和存储逻辑与顶点一致,系统内部可以以唯一的id标识一条边,以及处理重复、去重等相关问题。图数据结构中顶点和边的存储逻辑有一下几种:参考图6第一种,顶点、边分离模式:顶点、边分开存储采用两套数据结构;第二种,顶点、边一体化模式:顶点与边整合存储,用一套统一的数据结构来服务。图数据结构的特殊性还包含每一条边的存储需要正向、反向存储,它们之间的唯一区别是当前的边的方向属性值不同。
另外,在将源文件导入内存时,边文件中的顶点的id值对应于顶点文件中的顶点的id,如果出现没有对应id的情况,则可能存在顶点文件数据缺失的情况,或者,自动补全边文件出现数据错乱的情况。当出现上述情况时可以选择源文件导入失败或自动忽略该错误并补全缺失数据。若顶点或边文件中出现完全重复的数据,即为完全重复的顶点或完全重复的边,则可以报错源文件导入存储失败,或者自动忽略重复数据。
同一个顶点可能会存在多条边,指向多个邻居顶点,在边类型的源文件中,从一个顶点出发的多条边,会存在于多行之内,每行对应一条边,在图数据结构中,多条边则对应于同一个源顶点的多个顶点及属性所构成的多个矢量数据结构或多个指针所指向的矢量数据结构或链表类型数据结构。其中,矢量数据结构的特点是一次性数据插入或删除的性能要高于链表数据结构。
通过本申请实施例提供的图数据结构,实现了高效率、高并发的源文件导入内存,解决了源文件加载时间过长,单位时间数据加载量小,并发规模小的问题。
需要说明的是,本申请技术方案不仅仅适用于图数据结构(点、边),也可以用于其它任何可以并发加载的数据集(文件),只要该数据集中的数据内容之间不存在相邻数据的强依赖性,其中,强依赖性指的是后面的数据在加载的时候依赖前面相邻的数据来进行一些条件判断和数值生成。
S2012、通过预设的文件操作接口,对源文件进行处理,确定源文件的大小。
需要说明的是,由于计算机设备之间的差异,操作系统必须提供一组功能以便于应用程序控制这些设备,预设的文件操作接口指的是操作系统提供的文件操作接口。
通过预设文件操作接口,对源文件进行处理,以计算确定源文件的大小。
可选的,上述S202之前方法还包括:根据操作系统所支持的线程数,以及计算节点的数量,确定并发线程数。
具体地,获取操作系统所支持的线程数,若操作系统支持M个线程,则并发线程数为M,在多个计算节点系统内该并发线程数可以是(节点数*M)。
例如:若操作系统支持64线程,则支持的最大并发线程数可以为64,若有10个计算节点,则10个计算节点的并发线程数可以为10*64=640。
图7为本发明另一实施例提供的数据导入方法的流程示意图,如图7所示,上述S203包括:
S2031、判断每个线程对应的数据分片的起止点是否在一行数据的中间位置。
根据每一个线程对应的数据分片进行判断,该线程对应的数据分片是否在某一行的中间位置。
例如:若源文件有100个字节,并发线程数为6,则每个线程所获得的平均数据分片约17个字节,17是一个近似值,实际上等于对16.666666…进行了round操作,四舍五入后取17。判断该数据分片的起始点第一个字节和最后一个字节是否落在某一行数据的中间位置。
需要说明的是,相邻两个分片的首尾部分可能存在被切断、不完整的点、边数据,不完整的部分会被抛弃,但分片的逻辑会保证至少一个分片会保存有完整的相关数据,因此不会存在数据遗失的情况,对于数据重复的情况也会自动去重。
S2032、若多个线程中第一线程对应的数据分片的起止点在一行数据的中间位置,则对第一线程对应的数据分片进行重定位。
其中,若多个线程中的第一线程对应的数据分片的起止点在一行数据的中间位置,则需要对第一线程对应的数据分片重新定位。
例如:继续上述举例,若则每个线程所获得的数据分片大小为16.666666,第一线程对应的数据分片的终点落在了数据第17行的中间位置,则需要对该第一线程对应的数据分片重新定位。
S2033、采用第一线程,对重定位后的第一线程对应的数据分片进行读取操作,并将读取到的数据导入内存。
根据第一线程,对重新定位后的第一线程分配得到的数据分片进行读取操作,以将读取到的数据导入内存中。
可选的,对第一线程对应的数据分片进行重定位,包括:将向前寻址的行首作为重定位后第一线程对应的数据分片的起点。
需要说明的是,当对第一线程对应的数据分片进行重新定位时,可以将该数据分片对应的起点调整为向前寻址的行首。
例如:若源文件有100个字节,并发线程数为6,则每个线程所获得的数据分片大小为16.666666,四舍五入后取17,判断该数据分片的起始点第一个字节和最后一个字节是否落在某一行数据的中间位置。若该数据分片的起点落在了某一行的中间位置,则可以向前寻找并定位当前行的行首作为重定位的该数据分片的起点。
若某一线程所分配的数据分片的起始或终止的位置可能落在某一行的中间(非行首)的位置,则可以采用最大膨胀法(Maximum Expansion Method),即当某一线程对应的数据分片的起点落在某一行的中间位置时,则根据该数据分片的起点向前寻找并定位当前行的行首作为重定位的起点。若某一线程所分配的数据分片的终止的位置可能落在某一行的中间(非行首)的位置时,则根据该数据分片的终点向后寻找并定位当前行的行首未作为重定位的终点。可选的,对第一线程对应的数据分片进行重定位包括:将向后寻址的行末作为重定位后第一线程对应的数据分片的终点。
需要说明的是,当对第一线程对应的数据分片进行重新定位时,可以将该数据分片对应的终点调整为向后寻址该行的行末。
图8为本发明另一实施例提供的数据导入方法的流程示意图,上述S203还包括:
S2034、将下一行的行首作为重定位后的第二线程对应的数据分片的起点,第二线程为第一线程的下一线程。
需要说明的是,重新定位之后,将下一行的行首作为重定位后的第二线程对应分片的起点,其中,第二线程为第一线程的下一线程。
若数据分片有k个,可以对k个数据分片进行预先的逻辑判定,若第一线程所要处理的数据分片的首部或者尾部处于中间的位置,则可以采用有序膨胀法(SequentialExpansion Method)向后寻址到当前行的行未,而第二线程则自动从下一行开始,第二线程的起点为下一行的行首,同理,之后的所有并发线程均自动从下一行开始,避免同一行的数据被两个数据分片加载。
S2035、采用第二线程,将重定位后的第二线程对应的数据分片,导入内存。
需要说明的是,采用第二线程将重定位的第二线程对应的数据分片导入内存,同理,多个线程中的每一线程均可以并发的将每一线程对应的数据分片导入内存。
可选的,采用并发线程数对应的多个线程,分别读取对应的数据分片,包括:采用每个线程,以分隔符对每个线程对应的数据分片中的每行数据进行分解,并对分解到的每行数据对应的多个数据项进行读取操作。
具体地,每一线程对数据分片中的每行数据进行处理时,以分隔符的方式对每个线程对应的数据分片中每行数据进行分解,并对分解到的每行数据对应的多个数据项进行读取操作,以便后续将每一线程对应的数据分片导入内存,以使数据导入程序可以采用更简单的逻辑来实现数据分片的重新定位、划分数据分片的起点或终点。
需要说明的是,源文件可以以多种文件方式存储于文件系统中,以边文件为例,每一行的两个顶点之间可以以任何分隔符来分隔,分隔符包括:空格、tab、逗号或其它字符,分隔符可以为单一的美国信息交换标准代码(American Standard Code for InformationInterchange,ASCII)字符,也可以是一个字符串。同理,源文件中行与行之间的行分隔符默认为文件系统支持的换行符,也可以是其它特殊的分隔符号。
源文件的命名方式包括:“无后缀方式”、“.txt”、“.csv”、“.tsv”等其它命名方式,可以被当前文件系统命名方式所接受,并将源文件存储在文件系统中。
可选的,将读取到的数据导入内存,包括:若读取到的数据为非整形数据,将读取到的数据进行整形化处理后导入内存。
需要说明的是,从每一线程从对应的数据分片中读取的数据,无论是整形还是字符串或其他类型,均需要将读取的数据进行整形之后导入内存。从顶点、边数据结构遍历的角度上,最高性能的一定是整形,其访问与计算性能是浮点数的数倍,是字符串类型的数十倍以上,在整形的基础上进行数学、统计类型等操作的效率也更高。还可以通过预判图数据结构最终可能形成的数据集的规模的上限来采用更精准的整形数据类型来实现最优的内存存储空间优化。
例如:若顶点的数据结构以及存储类型为有序增长的整形,又称序列化增长整形,则每一线程读取的数据为有序增长的整形数据,将整形数据导入内存无需额外处理,若顶点的数据结构以及存储类型为其它类型,则需要进行整形序列化处理来实现存储占用空间压缩、内存访问加速。
并发线程中每一线程在对应的数据分片导入内存时,通过读取每一行中的顶点、点的属性字段,将字段存入相应的内存中,内存数据结构的存储结构的选择逻辑为:考虑数据访问的性能(时间复杂度与空间复杂度),根据具体的需求选择读访问、写(插入)访问复杂度为O(1),删除与更新的复杂度为O(1)的数据结构,支持并发访问,避免多线程、高并发访问时出现线程间的可访问资源死锁。
可选的,将读取到的数据导入内存,包括:将读取到的数据以哈希表(Hashmap)结构存储在内存中。
另外,图数据结构中顶点和边的存储逻辑有两种,第一种,顶点、边分开存储,采用两套数据结构。第二种,顶点与边整合存储,用一套数据结构来服务。无论采用那种存储逻辑,所有并发线程所获取的并发线程均可以通过高度并发的方式被插入哈希表中,即就是以并发式的哈希表的结构存储。根据源文件的大小,以及并发线程数,可以精准的预估内存中所需空间以及为对应的“避免哈希冲突(Hash Collison)的哈希函数”提供精准的参数。
由于每一次出现哈希冲突时,均会导致时耗延迟使得操作系统的吞吐率降低,因此在哈希表结构中多个键值对应同一个存储空间的位置时(即哈希冲突),可以采用多个键值通过链表的方式挂载在存储空间中进行存储,规避哈希冲突。哈希表结构中数据结构接口的操作分为4大类,分别是搜索(lookup)、插入(insert)、删除(delete)和更新(update)。搜索操作是根据键在哈希表中取得对应的键值,或者返回“值不存在”;插入操作会返回成功插入或因键冲突而导致插入失败或者因为哈希表满而导致的失败;删除操作指的是找到当前键以及对应的键值并在表中删除,更新操作指的是找到对应的键以及键值并进行更新,在数据处理技术中,特别是大数据框架中,通常将上述4类操作简称为CRUD或CRAP操作。
在图数据结构中采用顶点和边整合存储时,为了实现访问的高效性,需要实现O(1)的访问时间复杂度,也就是说写入与读取的访问速度恒定,其时间复杂度要远远低于传统的关系型数据库的读写访问速度在O(log(n))至O(n)之间,n对应于顶点或边的数量。
为了实现O(1)的时间复杂度,则可以使用哈希表结构,将不同的键定位在哈希表结构中同一个桶(bucket)的位置,不同键对应的不同键值可以通过链表的方式挂载在同一个桶中进行存储,避免了键插入时引起的哈希冲突。本发明技术方案中,采用了高性能、高并发的哈希表结构,采取的是用空间来换时间,可以用更大的存储空间来保证时间复杂度的相对较低,实现数据分片导入内存时“读”、“写”的高并发。
其中,哈希冲突指的是不同的键(keys)通常会通过链表的方式来挂载在当前桶之下存储,也就是分离锁链法(Separate-Chaining Method)。
本申请实施例中,采用哈希表类的数据结构来支持桶级别的细颗粒度管理,哈希表是一个高维的数据结构,第一级是哈希,把它理解为一个纵向的一维的表,其中每个元素是对应一个键(Key),该表可以被分割为多份,每一份可以服务一个参与并发的线程,而多份就是允许多个线程的同时的操作。哈希表的第二级是哈希表中的每个键所对应的值(values),值可以有多个,当这些值被向量数组(vector)所表达时,它们又可以支持并发的访问。可选的,方法还包括:采用多个线程,对内存中多个线程的访问键值对应的存储空间的数据进行访问操作。
其中,访问操作包括:搜索(读)、插入、删除,采用多个线程并发对内存中多个线程的访问键值对应的存储空间的数据进行访问操作。
采用多线程读多线程写的目的在于避免全局资源锁定,并尽可能把每个线程访问的锁定的资源最小化;避免出现并发访问的线程锁死(locking)或阻塞(blocking)。锁死或阻塞指的是在并发场景中,当多个线程去访问同一块资源区域时,如果它们都是只读,那么这里并不涉及任何阻塞,但是如果有1个线程去执行写的操作,其它所有线程就会被无法同时进行读或写的操作,因为会出现结果的不确定性,这个时候会有两种情况:第一种,其它线程被阻塞,等待第一个线程完成写操作后,才能继续操作这个操作称之为阻塞;第二种,其它线程即刻返回,去进行其它操作,然后再过一段时间后再尝试继续操作,被称之为非阻塞。
为了实现多线程读多线程写,可以对资源的颗粒度进行细分,例如:如果一整块内存空间中有10GB,如果分成10块,每一块有1GB,每一小块被1个线程锁定时,其它线程均可以独立完成读或写操作,全部的资源就在同时支持多读或多写。对资源的颗粒度细分支持了细颗粒度的资源是锁定,降低了多线程并发时可能出现的互相锁死或者阻塞现象,进一步实现了更高的并发。
具体地,实现颗粒度为桶级别的细颗粒度资源锁定与释放,使得每个参与并发的线程每次访问唯一可以占有并锁定的资源仅限于当前线程所访问的键所对应的桶。
需要说明的是,为了避免不必要的共享数据(common data)的访问,避免使用全局线程,采用本地化线程,避免使用全局计数器,改为使用隶属线程的计数器。实现了细颗粒度的资源利用。优化并发控制逻辑,在细颗粒度资源锁定的基础上,采用条纹锁(striped-locking)和自旋锁(spinlock)逻辑来实现优化的并发访问,并且通过预取数据(DataPrefetching)来对可以预判的桶所对应的键值(Key-Value Pair)进行预加载(prefetching)来降低超高速缓存故障率(cache miss rate),进而实现数据访问加速。
多个线程并发将数据分片通过细颗粒度拆分,拆分后可以通过循环的方式将数据逐行导入内存中,导入完成后关闭源文件,对源文件导入数据库的结果进行统计分析,例如:对源文件导入内存中的时间进行分析。
可选的,方法还包括:若内存中一个存储空间对应的键值为多个,则将多个键值对应的存储空间的数据预加载至缓存中。
为了实现更高性能的资源访问与吞吐率,可以采用将多个键值对应的存储空间的数据预加载至缓存中。
具体地,预加载逻辑采用最近频繁命中的哈希键之值的方式。因为计算机设备中CPU(central processing unit,中央处理器)缓存空间有限,远远小于内存空间,因此,加载的数据量被严格控制,只有1%的内存数据结构中的键值会被加载进入缓存。
例如:在10GB的数据量规模中,键的空间消耗如果在100MB,那么只有1MB的键及对应的内存空间地址对会进入缓存。但是这1%的数据量对于哈希表的整体并发读写操作的性能的提升远超过1%,会有50%以上的加速效果。原因在于绝大多数的操作不是完全随机的,或者说都是相当有规律可循的,尤其是在海量源数据加载的过程中,当数据源已经存在某种排序时,加载会出现高度的连续性、重复性等特点,而缓存则会让加载性能成倍增加。
本申请实施例中,将文件系统中的源文件导入内存中,在图数据结构上的加载性能相比于现有技术得到了提高,在基于云平台的性能评测中,每个计算节点的吞吐率可达600MB/s(接近硬盘或网络云盘的物理吞吐率极限),每个计算节点加载源文件仅需要50s,并且随着底层物理存储与网络平台的吞吐率的提升,本申请技术方案中每个计算节点的吞吐率也得到提高。
图9为本申请一实施例提供的一种数据导入装置的结构示意图;如图9所示,该装置包括:
确定模块301,用于确定外存中预先指定的源文件的大小;
分割模块302,用于根据预设的并发线程数以及源文件的大小,对源文件进行分割,得到多个数据分片,每个数据分片对应一个线程;
导入模块303,用于采用并发线程数对应的多个线程,分别读取对应的数据分片,并将读取到的数据导入内存。
可选的,确定模块301,具体用于在文件系统中对源文件进行定位,并执行源文件的打开操作,文件系统中的文件以预设的数据结构存储在外存中;通过预设的文件操作接口,对源文件进行处理,确定源文件的大小。
可选的,确定模块301,还用于根据操作系统所支持的线程数,以及计算节点的数量,确定并发线程数。
可选的,源文件的大小包括源文件的行数,或,字节数量。
可选的,导入模块303,具体用于判断每个线程对应的数据分片的起止点是否在一行数据的中间位置;若多个线程中第一线程对应的数据分片的起止点在一行数据的中间位置,则对第一线程对应的数据分片进行重定位;采用第一线程,对重定位后的第一线程对应的数据分片进行读取操作,并将读取到的数据导入内存。
可选的,导入模块303,具体用于将向前寻址的行首作为重定位后第一线程对应的数据分片的起点。
可选的,导入模块303,具体用于将向后寻址的行末作为重定位后第一线程对应的数据分片的终点;
导入模块303,还用于将下一行的行首作为重定位后的第二线程对应的数据分片的起点,第二线程为第一线程的下一线程;采用第二线程,将重定位后的第二线程对应的数据分片,导入内存。
可选的,导入模块303,具体用于采用每个线程,以分隔符对每个线程对应的数据分片中的每行数据进行分解,并对分解到的每行数据对应的多个数据项进行读取操作。
可选的,导入模块303,具体用于若读取到的数据为非整形数据,将读取到的数据进行整形化处理后导入内存。
可选的,导入模块303,具体用于将读取到的数据以哈希表结构存储在内存中,哈希表结构中多个键值对应同一个存储空间的位置,多个键值通过链表的方式挂载在存储空间中进行存储。
可选的,参考图10,装置还包括:
访问模块304,用于采用多个线程,对内存中多个线程的访问键值对应的存储空间的数据进行访问操作。
可选的,装置还包括:
加载模块305,用于若内存中一个存储空间对应的键值为多个,则将多个键值对应的存储空间的数据预加载至缓存中。
以上这些模块可以是被配置成实施以上方法的一个或多个集成电路,例如:一个或多个特定集成电路(Application Specific Integrated Circuit,简称ASIC),或,一个或多个微处理器(digital singnal processor,简称DSP),或,一个或者多个现场可编程门阵列(Field Programmable Gate Array,简称FPGA)等。再如,当以上某个模块通过处理元件调度程序代码的形式实现时,该处理元件可以是通用处理器,例如中央处理器(CentralProcessing Unit,简称CPU)或其它可以调用程序代码的处理器。再如,这些模块可以集成在一起,以片上系统(system-on-a-chip,简称SOC)的形式实现。
可选地,本发明还提供一种程序产品,例如计算机可读存储介质,包括程序,该程序在被处理器执行时用于执行上述方法实施例。
在本发明所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
上述以软件功能单元的形式实现的集成的单元,可以存储在一个计算机可读取存储介质中。上述软件功能单元存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(英文:processor)执行本发明各个实施例方法的部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(英文:Read-Only Memory,简称:ROM)、随机存取存储器(英文:Random Access Memory,简称:RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
上仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以权利要求的保护范围为准。
以上仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种数据导入方法,其特征在于,包括:
确定外存中预先指定的源文件的大小;
根据预设的并发线程数以及所述源文件的大小,对所述源文件进行分割,得到多个数据分片,每个数据分片对应一个线程;
采用所述并发线程数对应的多个线程,分别读取对应的数据分片,并将读取到的数据导入内存。
2.根据权利要求1所述的方法,其特征在于,所述采用所述并发线程数对应的多个线程,分别读取对应的数据分片,并将读取到的数据导入内存,包括:
判断每个所述线程对应的数据分片的起止点是否在一行数据的中间位置;
若所述多个线程中第一线程对应的数据分片的起止点在一行数据的中间位置,则对所述第一线程对应的数据分片进行重定位;
采用所述第一线程,对重定位后的所述第一线程对应的数据分片进行读取操作,并将读取到的数据导入内存。
3.根据权利要求2所述的方法,其特征在于,所述对所述第一线程对应的数据分片进行重定位,包括:
将向前寻址的行首作为重定位后所述第一线程对应的数据分片的起点。
4.根据权利要求2所述的方法,其特征在于,所述对所述第一线程对应的数据分片进行重定位,包括:
将向后寻址的行末作为重定位后所述第一线程对应的数据分片的终点;
所述采用所述并发线程数对应的多个线程,分别将对应的数据分片导入内存,还包括:
将下一行的行首作为重定位后的第二线程对应的数据分片的起点,所述第二线程为所述第一线程的下一线程;
采用所述第二线程,将重定位后的所述第二线程对应的数据分片,导入内存。
5.根据权利要求1所述的方法,其特征在于,所述采用所述并发线程数对应的多个线程,分别读取对应的数据分片,包括:
采用每个所述线程,以分隔符对每个所述线程对应的数据分片中的每行数据进行分解,并对分解到的所述每行数据对应的多个数据项进行读取操作。
6.根据权利要求1所述的方法,其特征在于,所述将读取到的数据导入内存,包括:
将读取到的数据以哈希表结构存储在内存中,所述哈希表结构中多个键值对应同一个存储空间的位置,所述多个键值通过链表的方式挂载在所述存储空间中进行存储。
7.根据权利要求6所述的方法,其特征在于,所述方法还包括:
采用所述多个线程,对所述内存中所述多个线程的访问键值对应的存储空间的数据进行访问操作。
8.一种数据导入装置,其特征在于,包括:
确定模块,用于确定外存中预先指定的源文件的大小;
分割模块,用于根据预设的并发线程数以及所述源文件的大小,对所述源文件进行分割,得到多个数据分片,每个数据分片对应一个线程;
导入模块,用于采用所述并发线程数对应的多个线程,分别读取对应的数据分片,并将读取到的数据导入内存。
9.一种计算机设备,其特征在于,包括:存储器、处理器,所述存储器中存储有可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时,实现上述权利要求1至7任一项所述的方法的步骤。
10.一种存储介质,其特征在于,所述存储介质上存储有计算机程序,该计算机程序被处理器执行时,实现权利要求1至7中任一项所述方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010312564.4A CN111444149A (zh) | 2020-04-20 | 2020-04-20 | 一种数据导入方法、装置、设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010312564.4A CN111444149A (zh) | 2020-04-20 | 2020-04-20 | 一种数据导入方法、装置、设备及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN111444149A true CN111444149A (zh) | 2020-07-24 |
Family
ID=71654343
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010312564.4A Pending CN111444149A (zh) | 2020-04-20 | 2020-04-20 | 一种数据导入方法、装置、设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111444149A (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112214536A (zh) * | 2020-10-28 | 2021-01-12 | 重庆医药高等专科学校 | 一种企业账目数据实时导入管理系统 |
CN112685427A (zh) * | 2021-01-25 | 2021-04-20 | 拉卡拉支付股份有限公司 | 数据接入方法、装置、电子设备及存储介质 |
CN113535258A (zh) * | 2021-06-25 | 2021-10-22 | 杭州加速科技有限公司 | 一种Pattern文件加载方法及系统 |
CN116048780A (zh) * | 2022-12-07 | 2023-05-02 | 广州海量数据库技术有限公司 | 一种基于openGauss数据库的多线程批量文件加载方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104268096A (zh) * | 2014-09-26 | 2015-01-07 | 西南科技大学 | 基于内存预分配和多点并写技术的大规模点云数据快速读取方法 |
CN109408468A (zh) * | 2018-08-24 | 2019-03-01 | 阿里巴巴集团控股有限公司 | 文件处理方法和装置、计算设备及存储介质 |
CN110334018A (zh) * | 2019-06-18 | 2019-10-15 | 梁俊杰 | 一种大数据导入方法以及相关设备 |
-
2020
- 2020-04-20 CN CN202010312564.4A patent/CN111444149A/zh active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104268096A (zh) * | 2014-09-26 | 2015-01-07 | 西南科技大学 | 基于内存预分配和多点并写技术的大规模点云数据快速读取方法 |
CN109408468A (zh) * | 2018-08-24 | 2019-03-01 | 阿里巴巴集团控股有限公司 | 文件处理方法和装置、计算设备及存储介质 |
CN110334018A (zh) * | 2019-06-18 | 2019-10-15 | 梁俊杰 | 一种大数据导入方法以及相关设备 |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112214536A (zh) * | 2020-10-28 | 2021-01-12 | 重庆医药高等专科学校 | 一种企业账目数据实时导入管理系统 |
CN112214536B (zh) * | 2020-10-28 | 2022-08-02 | 重庆医药高等专科学校 | 一种企业账目数据实时导入管理系统 |
CN112685427A (zh) * | 2021-01-25 | 2021-04-20 | 拉卡拉支付股份有限公司 | 数据接入方法、装置、电子设备及存储介质 |
CN112685427B (zh) * | 2021-01-25 | 2024-03-26 | 拉卡拉支付股份有限公司 | 数据接入方法、装置、电子设备及存储介质 |
CN113535258A (zh) * | 2021-06-25 | 2021-10-22 | 杭州加速科技有限公司 | 一种Pattern文件加载方法及系统 |
CN113535258B (zh) * | 2021-06-25 | 2022-09-27 | 杭州加速科技有限公司 | 一种Pattern文件加载方法及系统 |
CN116048780A (zh) * | 2022-12-07 | 2023-05-02 | 广州海量数据库技术有限公司 | 一种基于openGauss数据库的多线程批量文件加载方法 |
CN116048780B (zh) * | 2022-12-07 | 2023-08-08 | 广州海量数据库技术有限公司 | 一种基于openGauss数据库的多线程批量文件加载方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111444149A (zh) | 一种数据导入方法、装置、设备及存储介质 | |
US9575984B2 (en) | Similarity analysis method, apparatus, and system | |
US11693830B2 (en) | Metadata management method, system and medium | |
US11093468B1 (en) | Advanced metadata management | |
EP2488950B1 (en) | A tiered data management method and system for high performance data monitoring | |
US10452655B2 (en) | In-memory cursor duration temp tables | |
Bernstein et al. | Optimizing optimistic concurrency control for tree-structured, log-structured databases | |
CN111046034A (zh) | 管理内存数据及在内存中维护数据的方法和系统 | |
US10983909B2 (en) | Trading off cache space and write amplification for Bε-trees | |
US10394811B2 (en) | Tail-based top-N query evaluation | |
Qi et al. | Packing R-trees with space-filling curves: Theoretical optimality, empirical efficiency, and bulk-loading parallelizability | |
CN109460406A (zh) | 一种数据处理方法及装置 | |
KR100419575B1 (ko) | 고차원 색인구조를 위한 벌크 로딩방법 | |
US20220342888A1 (en) | Object tagging | |
CN116893786B (zh) | 一种数据处理方法、装置、电子设备及存储介质 | |
CN108334532B (zh) | 一种基于Spark的Eclat并行化方法、系统及装置 | |
WO2023159976A1 (zh) | 数据分段写入方法、数据读取方法及装置 | |
Sun et al. | Mitigating asymmetric read and write costs in cuckoo hashing for storage systems | |
CN111290700A (zh) | 分布式数据读写方法和系统 | |
Carter et al. | Nanosecond indexing of graph data with hash maps and VLists | |
CN115963987A (zh) | 分布式存储方法、装置、设备及计算机可读存储介质 | |
CN115688906A (zh) | 一种面向超参训练的数据自动编排加载方法和系统 | |
WO2022001626A1 (zh) | 注入时序数据的方法、查询时序数据的方法及数据库系统 | |
CN116701386A (zh) | 键值对检索方法、装置及存储介质 | |
Kim et al. | PARADISE: Big data analytics using the DBMS tightly integrated with the distributed file system |
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 |