CN114764426A - 数据访问方法和装置、数据存储方法和装置 - Google Patents
数据访问方法和装置、数据存储方法和装置 Download PDFInfo
- Publication number
- CN114764426A CN114764426A CN202110052330.5A CN202110052330A CN114764426A CN 114764426 A CN114764426 A CN 114764426A CN 202110052330 A CN202110052330 A CN 202110052330A CN 114764426 A CN114764426 A CN 114764426A
- Authority
- CN
- China
- Prior art keywords
- target
- data
- position information
- space
- initial
- 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/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/28—Databases characterised by their database models, e.g. relational or object models
- G06F16/283—Multi-dimensional databases or data warehouses, e.g. MOLAP or ROLAP
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
Landscapes
- Engineering & Computer Science (AREA)
- Databases & Information Systems (AREA)
- Theoretical Computer Science (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computational Linguistics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本申请涉及数据存储和数据读取,具体涉及一种数据访问方法和装置。所述方法包括:获取与待访问对象对应的、且携带有目标索引信息的数据访问指令;根据目标索引信息,确定加载有共享内存文件的目标地址空间的第一首地址、及待访问对象中的初始对象在目标共享空间中的初始位置信息;共享内存文件是对目标共享空间中的各数据对象进行映射得到;基于第一首地址对初始位置信息进行调整,得到与目标地址空间相匹配的对象位置信息;根据对象位置信息,并通过调用目标地址空间,获取与初始对象对应的数据内容;依次对待访问对象中除初始对象之外的各个目标对象进行轮询处理,以得到每个目标对象各自所对应的数据内容。采用本方法能够节约计算机资源。
Description
技术领域
本申请涉及计算机技术领域,特别是涉及一种数据访问方法和装置、数据存储方法和装置。
背景技术
随着计算机技术的发展,可在堆外申请一个堆外内存空间,用以存储较为常用的数据。但是,由于JVM(Java Virtual Machine,Java执行引擎)的限制,在堆外内存空间中无法直接存储数据对象,只能存储对象字节流,在将数据对象存储于堆外内存空间时,需对数据对象进行序列化,将其转换为对象字节流,当需要借助JVM对堆外内存数据的访问时,就需要通过反序列化将对象字节流转换为数据对象。
然而,通过序列化和反序列化算法来实现JVM对其内部数据的访问,会耗费CPU等计算机资源,从而造成资源的浪费。
发明内容
基于此,有必要针对上述技术问题,提供一种节约计算机资源的数据访问方法、装置、计算机设备、存储介质和计算机程序,以及数据存储方法、装置、计算机设备、存储介质和计算机程序。
一种数据访问方法,所述方法包括:
获取与待访问对象对应的、且携带有目标索引信息的数据访问指令,所述待访问对象为写入至目标共享空间中的数据对象的至少一部分,且所述待访问对象中包括有至少一个目标对象;
根据所述目标索引信息,确定加载有共享内存文件的目标地址空间的第一首地址、及所述待访问对象中的初始对象在所述目标共享空间中的初始位置信息;所述共享内存文件是对所述目标共享空间中的各数据对象进行映射得到;
基于所述第一首地址对所述初始位置信息进行调整,得到与所述目标地址空间相匹配的对象位置信息;
根据所述对象位置信息,并通过调用所述目标地址空间,获取与所述初始对象对应的数据内容;
依次对所述待访问对象中除初始对象之外的各个目标对象进行轮询处理,以得到每个目标对象各自所对应的数据内容;其中,对于每次轮询至的当前目标对象,根据前次轮询至的前序目标对象的对象位置信息,确定当次轮询至的当前目标对象的对象位置信息,并根据所述当前目标对象的对象位置信息,通过调用所述目标地址空间,获取与所述当前目标对象对应的数据内容。在一个实施例中,所述方法还包括:
当与所述目标地址空间相对应的目标物理内存中的待访问对象符合删除条件时,将所述待访问对象从所述目标物理内存中删除。
在一个实施例中,所述根据所述当前目标对象的对象位置信息,通过调用所述目标地址空间,获取与所述当前目标对象对应的数据内容,包括:
根据所述当前目标对象的对象位置信息,通过调用所述目标地址空间,获取所述当前目标对象中的数据内容;
当所述当前目标对象中的数据内容表征所述当前目标对象引用了至少一层的引用对象时,基于各层引用对象各自所对应的引用位置信息,确定各层引用对象各自所包括的数据内容;
将所述当前目标对象中的数据内容和各层引用对象各自所包括的数据内容,共同作为与所述当前目标对象对应的数据内容。
在一个实施例中,所述当所述当前目标对象中的数据内容表征所述当前目标对象引用了至少一层的引用对象时,基于各层引用对象各自所对应的引用位置信息,确定各层引用对象各自所包括的数据内容,包括:
当所述当前目标对象中的数据内容表征所述当前目标对象引用了至少一层的引用对象时,对于每层的引用对象,分别基于所述第一首地址、以及所述目标共享空间的第二首地址中的至少一种,对相应层级的引用对象的引用位置信息进行调整,得到相应层级的引用对象所对应的、且与所述目标地址空间相匹配的对象位置信息;
根据每个层级的引用对象各自所对应的对象位置信息,并通过调用所述目标地址空间,获取与每个层级的引用对象各自对应的数据内容。
在一个实施例中,获取与待访问对象对应的、且携带有目标索引信息的数据访问指令之前,所述方法还包括:
获取共享内存文件的文件存储路径,通过所述文件存储路径将对应的所述共享内存文件加载至所述目标地址空间,得到所述目标地址空间的第一首地址;
根据所述目标地址空间的第一首地址,获取所述共享内存文件中的校验信息,并根据所述校验信息对所述共享内存文件的完整性进行校验。
一种数据访问装置,包括:
初始位置确定模块,用于获取与待访问对象对应的、且携带有目标索引信息的数据访问指令,所述待访问对象为写入至目标共享空间中的数据对象的至少一部分,且所述待访问对象中包括有至少一个目标对象;根据所述目标索引信息,确定加载有共享内存文件的目标地址空间的第一首地址、及所述待访问对象中的初始对象在所述目标共享空间中的初始位置信息;所述共享内存文件是对所述目标共享空间中的各数据对象进行映射得到;
初始对象获取模块,用于基于所述第一首地址对所述初始位置信息进行调整,得到与所述目标地址空间相匹配的对象位置信息;根据所述对象位置信息,并通过调用所述目标地址空间,获取与所述初始对象对应的数据内容;
目标对象获取模块,用于依次对所述待访问对象中除初始对象之外的各个目标对象进行轮询处理,以得到每个目标对象各自所对应的数据内容;其中,对于每次轮询至的当前目标对象,根据前次轮询至的前序目标对象的对象位置信息,确定当次轮询至的当前目标对象的对象位置信息,并根据所述当前目标对象的对象位置信息,通过调用所述目标地址空间,获取与所述当前目标对象对应的数据内容。
在一个实施例中,所述目标索引信息包括共享内存文件的文件存储路径和目标片段标识;所述初始位置确定模块还包括目标片段确定模块,用于根据所述文件存储路径,确定加载有共享内存文件的目标地址空间的第一首地址,并基于所述第一首地址确定与所述共享内存文件对应的文件元数据;根据所述文件元数据和所述目标片段标识,确定与所述待访问对象对应的目标片段;根据所述目标片段的片段内容,确定所述待访问对象中的初始对象在所述目标共享空间中的初始位置信息。
在一个实施例中,所述文件元数据包括所述共享内存文件中的头部所占用内存的空间大小;所述目标片段确定模块还用于根据所述目标片段标识和所述空间大小,确定与所述待访问对象对应的目标片段在所述目标共享空间中的第一偏移位置信息;根据所述第一首地址和所述第一偏移位置信息,确定与所述目标片段对应、且与所述目标地址空间相匹配的片段位置信息;根据所述目标片段的片段位置信息,确定所述目标片段的片段内容。
在一个实施例中,所述数据访问指令通过数据访问进程触发,所述初始对象获取模块还用于响应于所述数据访问指令,根据与所述初始对象对应的对象位置信息,并通过所述数据访问进程调用所述目标地址空间,从与所述目标地址空间相对应的目标物理内存中读取所述初始对象的数据内容并反馈;其中,所述目标物理内存中的数据内容是通过计算机内核从所述共享内存文件中调入并存储至的。
在一个实施例中,所述数据访问装置还包括删除模块,用于当与所述目标地址空间相对应的目标物理内存中的待访问对象符合删除条件时,将所述待访问对象从所述目标物理内存中删除。
在一个实施例中,所述目标对象获取模块还用于确定前次轮询至的前序目标对象的对象位置信息和所述前序目标对象所占用内存的空间大小;基于所述前序目标对象的对象位置信息和所述前序目标对象所占用内存的空间大小,确定当次轮询至的当前目标对象的对象位置信息。
在一个实施例中,所述目标对象获取模块包括引用对象获取模块,用于根据所述当前目标对象的对象位置信息,通过调用所述目标地址空间,获取所述当前目标对象中的数据内容;当所述当前目标对象中的数据内容表征所述当前目标对象引用了至少一层的引用对象时,基于各层引用对象各自所对应的引用位置信息,确定各层引用对象各自所包括的数据内容;将所述当前目标对象中的数据内容和各层引用对象各自所包括的数据内容,共同作为与所述当前目标对象对应的数据内容。
在一个实施例中,所述引用对象获取模块还用于当所述当前目标对象中的数据内容表征所述当前目标对象引用了至少一层的引用对象时,对于每层的引用对象,分别基于所述第一首地址、以及所述目标共享空间的第二首地址中的至少一种,对相应层级的引用对象的引用位置信息进行调整,得到相应层级的引用对象所对应的、且与所述目标地址空间相匹配的对象位置信息;根据每个层级的引用对象各自所对应的对象位置信息,并通过调用所述目标地址空间,获取与每个层级的引用对象各自对应的数据内容。
在一个实施例中,所述引用对象获取模块还用于当所述当前目标对象中的数据内容包括所述当前目标对象在当前层级所引用的引用对象的引用位置信息时,基于所述第一首地址、以及所述目标共享空间的第二首地址中的至少一种,对当前层级的引用对象的引用位置信息进行调整,得到当前层级的引用对象所对应的、且与所述目标地址空间相匹配的对象位置信息;根据当前层级的引用对象的对象位置信息,并通过调用所述目标地址空间,获取与所述当前层级的引用对象对应的数据内容;当所述当前层级的引用对象中的数据内容包括下一层级的引用对象在所述目标共享空间中的引用位置信息时,将所述下一层级的引用对象作为下一轮的当前层级的引用对象,返回所述基于所述第一首地址、以及所述目标共享空间的第二首地址中的至少一种,对当前层级的引用对象的引用位置信息进行调整,得到当前层级的引用对象所对应的、且与所述目标地址空间相匹配的对象位置信息的步骤继续执行,直至得到最终层级的引用对象的数据内容为止。
在一个实施例中,所述数据访问装置还用于获取共享内存文件的文件存储路径,通过所述文件存储路径将对应的所述共享内存文件加载至所述目标地址空间,得到所述目标地址空间的第一首地址;根据所述目标地址空间的第一首地址,获取所述共享内存文件中的校验信息,并根据所述校验信息对所述共享内存文件的完整性进行校验。
在一个实施例中,所述待访问对象为OLAP引擎组件通过大数据平台采集的商品交易数据;所述数据访问装置还用于当获取得到与所述待访问对象对应的目标商品交易数据时,对所述目标商品交易数据进行多维度分析,得到商品交易分析报告。
一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现以下步骤:
获取与待访问对象对应的、且携带有目标索引信息的数据访问指令,所述待访问对象为写入至目标共享空间中的数据对象的至少一部分,且所述待访问对象中包括有至少一个目标对象;
根据所述目标索引信息,确定加载有共享内存文件的目标地址空间的第一首地址、及所述待访问对象中的初始对象在所述目标共享空间中的初始位置信息;所述共享内存文件是对所述目标共享空间中的各数据对象进行映射得到;
基于所述第一首地址对所述初始位置信息进行调整,得到与所述目标地址空间相匹配的对象位置信息;
根据所述对象位置信息,并通过调用所述目标地址空间,获取与所述初始对象对应的数据内容;
依次对所述待访问对象中除初始对象之外的各个目标对象进行轮询处理,以得到每个目标对象各自所对应的数据内容;其中,对于每次轮询至的当前目标对象,根据前次轮询至的前序目标对象的对象位置信息,确定当次轮询至的当前目标对象的对象位置信息,并根据所述当前目标对象的对象位置信息,通过调用所述目标地址空间,获取与所述当前目标对象对应的数据内容。
一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:
获取与待访问对象对应的、且携带有目标索引信息的数据访问指令,所述待访问对象为写入至目标共享空间中的数据对象的至少一部分,且所述待访问对象中包括有至少一个目标对象;
根据所述目标索引信息,确定加载有共享内存文件的目标地址空间的第一首地址、及所述待访问对象中的初始对象在所述目标共享空间中的初始位置信息;所述共享内存文件是对所述目标共享空间中的各数据对象进行映射得到;
基于所述第一首地址对所述初始位置信息进行调整,得到与所述目标地址空间相匹配的对象位置信息;
根据所述对象位置信息,并通过调用所述目标地址空间,获取与所述初始对象对应的数据内容;
依次对所述待访问对象中除初始对象之外的各个目标对象进行轮询处理,以得到每个目标对象各自所对应的数据内容;其中,对于每次轮询至的当前目标对象,根据前次轮询至的前序目标对象的对象位置信息,确定当次轮询至的当前目标对象的对象位置信息,并根据所述当前目标对象的对象位置信息,通过调用所述目标地址空间,获取与所述当前目标对象对应的数据内容。
一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行以下步骤:
获取与待访问对象对应的、且携带有目标索引信息的数据访问指令,所述待访问对象为写入至目标共享空间中的数据对象的至少一部分,且所述待访问对象中包括有至少一个目标对象;
根据所述目标索引信息,确定加载有共享内存文件的目标地址空间的第一首地址、及所述待访问对象中的初始对象在所述目标共享空间中的初始位置信息;所述共享内存文件是对所述目标共享空间中的各数据对象进行映射得到;
基于所述第一首地址对所述初始位置信息进行调整,得到与所述目标地址空间相匹配的对象位置信息;
根据所述对象位置信息,并通过调用所述目标地址空间,获取与所述初始对象对应的数据内容;
依次对所述待访问对象中除初始对象之外的各个目标对象进行轮询处理,以得到每个目标对象各自所对应的数据内容;其中,对于每次轮询至的当前目标对象,根据前次轮询至的前序目标对象的对象位置信息,确定当次轮询至的当前目标对象的对象位置信息,并根据所述当前目标对象的对象位置信息,通过调用所述目标地址空间,获取与所述当前目标对象对应的数据内容。
上述数据访问方法、装置、计算机设备、存储介质和计算机程序,通过获取数据访问指令,可以基于数据访问指令中的目标索引信息准确得知初始对象的初始位置信息。通过确定初始位置信息,可基于目标地址空间的第一首地址对初始位置信息进行调整,得到与目标地址空间相匹配的对象位置信息。通过确定对象位置信息,可基于对象位置信息获取初始对象的数据内容,并依次对待访问对象中除初始对象之外的各个目标对象进行轮询处理,以得到每个目标对象各自所对应的数据内容。由于在数据访问的过程中,直接将共享内存文件加载至目标地址空间后,即可通过调用目标地址空间,获取相应数据内容,而无需对任何待访问对象进行序列化和反序列化,相比于传统的需要对待访问对象进行序列化和反序列化后才能获取得到相应的数据内容,本方法可节约计算机资源。
此外,由于在对数据对象进行序列化和反序列化的过程中,会产生大量的临时对象,从而占用大量的内存资源,本方法还可有效减少大量临时对象所占用的内存空间,从而提升内存的利用率。
一种数据访问方法,所述方法包括:
获取待写入的数据对象,并确定与所述数据对象相对应的目标共享空间;所述目标共享空间包括内容存储区域和片段存储区域;
将所述数据对象写入所述目标共享空间中的内容存储区域;
生成与所述数据对象相对应的原始片段,并将所述原始片段写入所述共享内存空间的片段存储区域;
根据所述目标共享空间的第二首地址、以及所述数据对象中的初始存储对象在所述目标共享空间中的初始存储地址,确定所述初始存储对象在所述目标共享空间中的第二偏移位置信息;
根据所述第二偏移位置信息,对所述原始片段中的片段元信息进行调整,得到与所述数据对象对应的目标片段;其中,所述目标片段中的片段元信息用于指示所述数据对象中的初始存储对象在所述目标共享空间中的存储位置。
在一个实施例中,所述方法还包括:
当所述目标共享空间符合映射条件时,根据预设的文件存储路径,将存储于所述目标共享空间中的数据对象映射至磁盘,得到存储于磁盘中的共享内存文件。
一种数据存储装置,包括:
数据写入模块,用于获取待写入的数据对象,并确定与所述数据对象相对应的目标共享空间;所述目标共享空间包括内容存储区域和片段存储区域;将所述数据对象写入所述目标共享空间中的内容存储区域;
片段写入模块,用于生成与所述数据对象相对应的原始片段,并将所述原始片段写入所述共享内存空间的片段存储区域;
片段调整模块,用于根据所述目标共享空间的第二首地址、以及所述数据对象中的初始存储对象在所述目标共享空间中的初始存储地址,确定所述初始存储对象在所述目标共享空间中的第二偏移位置信息;根据所述第二偏移位置信息,对所述原始片段中的片段元信息进行调整,得到与所述数据对象对应的目标片段;其中,所述目标片段中的片段元信息用于指示所述数据对象中的初始存储对象在所述目标共享空间中的存储位置。
在一个实施例中,所述数据写入模块还用于确定所述数据对象中的每个存储对象分别引用的引用对象;将所述存储对象和所述引用对象,写入所述内容存储区域。
在一个实施例中,所述片段写入模块还用于生成与所述数据对象相对应的原始片段;确定所述片段存储区域中已存储的、且位于最后顺序的片段在所述目标共享空间中的已占用位置信息;根据所述已占用位置信息,确定所述片段存储区域中的目标未占用位置,并将所述原始片段写入所述目标未占用位置处。
在一个实施例中,所述目标共享空间包括文件元信息存储区域;所述数据存储装置还用于当所述数据对象被写入至所述目标共享空间中的内容存储区域中时,读取存储于所述文件元信息存储区域中的片段总数量和数据总量;分别对所述片段总数量和所述数据总量进行数值的增加。
在一个实施例中,所述数据存储装置还用于当所述目标共享空间符合映射条件时,根据预设的文件存储路径,将存储于所述目标共享空间中的数据对象映射至磁盘,得到存储于磁盘中的共享内存文件。
一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现以下步骤:
获取待写入的数据对象,并确定与所述数据对象相对应的目标共享空间;所述目标共享空间包括内容存储区域和片段存储区域;
将所述数据对象写入所述目标共享空间中的内容存储区域;
生成与所述数据对象相对应的原始片段,并将所述原始片段写入所述共享内存空间的片段存储区域;
根据所述目标共享空间的第二首地址、以及所述数据对象中的初始存储对象在所述目标共享空间中的初始存储地址,确定所述初始存储对象在所述目标共享空间中的第二偏移位置信息;
根据所述第二偏移位置信息,对所述原始片段中的片段元信息进行调整,得到与所述数据对象对应的目标片段;其中,所述目标片段中的片段元信息用于指示所述数据对象中的初始存储对象在所述目标共享空间中的存储位置。
一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:
获取待写入的数据对象,并确定与所述数据对象相对应的目标共享空间;所述目标共享空间包括内容存储区域和片段存储区域;
将所述数据对象写入所述目标共享空间中的内容存储区域;
生成与所述数据对象相对应的原始片段,并将所述原始片段写入所述共享内存空间的片段存储区域;
根据所述目标共享空间的第二首地址、以及所述数据对象中的初始存储对象在所述目标共享空间中的初始存储地址,确定所述初始存储对象在所述目标共享空间中的第二偏移位置信息;
根据所述第二偏移位置信息,对所述原始片段中的片段元信息进行调整,得到与所述数据对象对应的目标片段;其中,所述目标片段中的片段元信息用于指示所述数据对象中的初始存储对象在所述目标共享空间中的存储位置。
一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行以下步骤:
获取待写入的数据对象,并确定与所述数据对象相对应的目标共享空间;所述目标共享空间包括内容存储区域和片段存储区域;
将所述数据对象写入所述目标共享空间中的内容存储区域;
生成与所述数据对象相对应的原始片段,并将所述原始片段写入所述共享内存空间的片段存储区域;
根据所述目标共享空间的第二首地址、以及所述数据对象中的初始存储对象在所述目标共享空间中的初始存储地址,确定所述初始存储对象在所述目标共享空间中的第二偏移位置信息;
根据所述第二偏移位置信息,对所述原始片段中的片段元信息进行调整,得到与所述数据对象对应的目标片段;其中,所述目标片段中的片段元信息用于指示所述数据对象中的初始存储对象在所述目标共享空间中的存储位置。
上述数据存储方法、装置、计算机设备、存储介质和计算机程序,通过将数据对象写入目标共享空间中的内容存储区域以及将所生成原始片段存储于片段存储区域,可以基于根据目标共享空间的第二首地址和初始存储地址,对原始片段进行调整,得到数据对象对应的目标片段。通过得到目标片段,可以在需要对数据对象进行访问时,基于目标片段数据对象中的初始存储对象在目标共享空间中的存储位置。由于可以直接将数据对象存储于目标内存空间,以及通过目标片段直接读取数据对象,相比于传统的需要对待访问对象进行序列化和反序列化后才能获取得到相应的数据内容,本方法无需进行任何序列化和反序列化,从而节约计算机资源。
附图说明
图1为一个实施例中数据访问方法的应用环境图;
图2为一个实施例中数据访问方法的流程示意图;
图3为一个实施例中计算机设备的架构示意图;
图4为一个实施例中共享内存文件的内部布局示意图;
图5为一个实施例中数据访问的流程示意图;
图6为一个实施例中数据存储方法的流程示意图;
图7为具体一个实施例中数据访问方法的流程示意图;
图8为具体一个实施例中数据存储方法的流程示意图;
图9为一个实施例中数据访问装置的结构框图;
图10为一个实施例中数据存储装置的结构框图;
图11为一个实施例中计算机设备的内部结构图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
图1为一个实施例中数据访问方法的应用环境图。参照图1,该数据访问方法应用于数据访问系统。该数据访问系统包括计算机设备102、第一终端104以及第二终端106。第一终端104和计算机设备102通过网络连接,第二终端106和计算机设备102通过网络连接。第一终端104用于向计算机设备102中写入数据对象,从而计算机设备可将写入的数据对象映射至共享内存文件,并将共享内存文件加载至目标地址空间。第二终端106用于向计算机设备102发送目标索引信息,从而计算机设备102可基于目标索引信息,调用目标地址空间访问待访问对象。容易理解,第一终端104也可用于向计算机设备102发送目标索引信息,第二终端106也可用于向计算机设备102中写入数据对象。
计算机设备102可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、CDN、以及大数据和人工智能平台等基础云计算服务的云服务器。第一终端104和第二终端106可以是智能手机、平板电脑、笔记本电脑、台式计算机、智能音箱、智能手表等,但并不局限于此。终端以及服务器可以通过有线或无线通信方式进行直接或间接地连接,本申请在此不做限制。
本申请涉及数据存储,具体涉及数据的云存储。云存储(cloud storage)是在云计算概念上延伸和发展出来的一个新的概念,分布式云存储系统(以下简称存储系统)是指通过集群应用、网格技术以及分布存储文件系统等功能,将网络中大量各种不同类型的存储设备(存储设备也称之为存储节点)通过应用软件或应用接口集合起来协同工作,共同对外提供数据存储和业务访问功能的一个存储系统。
目前,存储系统的存储方法为:创建逻辑卷,在创建逻辑卷时,就为每个逻辑卷分配物理存储空间,该物理存储空间可能是某个存储设备或者某几个存储设备的磁盘组成。前端在某一逻辑卷上存储数据,也就是将数据存储在文件系统上,文件系统将数据分成许多部分,每一部分是一个对象,对象不仅包含数据而且还包含数据标识(ID,ID entity)等额外的信息,文件系统将每个对象分别写入该逻辑卷的物理存储空间,且文件系统会记录每个对象的存储位置信息,从而当前端请求访问数据时,文件系统能够根据每个对象的存储位置信息让前端对数据进行访问。
存储系统为逻辑卷分配物理存储空间的过程,具体为:按照对存储于逻辑卷的对象的容量估量(该估量往往相对于实际要存储的对象的容量有很大余量)和独立冗余磁盘阵列(RAID,Redundant Array of Independent Disk)的组别,预先将物理存储空间划分成分条,一个逻辑卷可以理解为一个分条,从而为逻辑卷分配了物理存储空间。
本申请提供的数据访问方法可以应用于数据访问系统中,数据访问系统可以是由接入设备、多个节点连接形成的分布式系统。分布式架构系统具体可以是区块链系统,区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。区块链(Blockchain),本质上是一个去中心化的数据库,是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了一批次网络交易的信息,用于验证其信息的有效性(防伪)和生成下一个区块。区块链可以包括区块链底层平台、平台产品服务层及应用服务层。
在传统方案中,都是通过JDK提供的机制,通过io((Input/Output),输入/输出)函数,数据序列化和反序列化函数等调用来实现数据对象的传输,在此过程中无论是数据对象存储时还是数据对象读取时都会产生大量的临时数据对象,会给进程的GC(GarbageCollection,垃圾回收)造成很大的压力,严重影响数据运行效率。此外,读取数据对象的过程中,通常涉及到的数据规模很大,总数据量可以在PB级别,单数据访问进程负责维护的数据也在TB级别,由于计算机设备的内存有限,每次数据访问都需要把数据从磁盘加载进LRUcache(Least Recently Used cache,最近最久未使用缓存),更新cache,频繁的io操作给磁盘造成很大的读写压力,因此,在数据读取的过程中,数据会多次在用户态和内核态的内存里面拷贝,从而影响系统效率和磁盘寿命。再者,若通过JVM提供的unsafe api(不安全接口)来申请堆外内存,并把数据放到堆外,来实现offheap(堆外内存)功能的方式,在数据读取时,依然无法做到完全避免堆内和堆外数据的复制。
本申请通过在JVM层面提供新的数据读取接口以及数据访问接口,可以在前端把相应的数据对象直接映射为磁盘上的一个共享内存文件(mmap内存文件),之后将这个共享内存文件通过比如SCP第三方工具,或者直接存储在计算机前端和计算机后端均可访问网络存储设备,从而可以避免数据访问进程的文件读写,后端在使用这个共享内存文件的过程中,可以直接调用提供的数据读取接口通过mmap系统调用把这个共享内存文件的数据一次性映射到数据访问进程中,再此过程中不需要对任何数据对象进行序列化和反序列化,并且通过相应的接口来控制与数据访问进程相对应的目标物理内存的使用和释放,可以避免传统的通过LRU cache控制数据在内存和磁盘间的数据传输。
为了更好地实施本申请中的数据访问方法和数据存储方法,在实施数据访问以及数据读取之前,可以预先构建数据读取接口以及数据存储接口,下面则对其中涉及到的关键接口函数进行介绍:
(1)void*JVM_Cache_Init(size_t size):
通过计算机前端向计算机内核申请一块大小为size(页面大小对齐)字节的共享内存空间,这个共享内存空间完全在堆外,不受JVM的GC线程的管理。在调用void*JVM_Cache_Init(size_t size)函数的过程中,该函数会完成共享内存空间的申请,以及头部(meta)的初始化等工作。
(2)int JVM_Cache_write(Object obj):
该函数将输入的参数obj作为根对象,从根对象obj出发,通过广度优先遍历,依次把obj和obj引用到的所有的数据对象通过glibc提供的函数void*memcpy(void*dest,const void*src,size_t n)复制到通过JVM_Cache_Init申请的堆外内存(共享内存空间)里面,为了保证数据一致性,这个操作将会是一个VM_operation,也就是该函数会让JVM先进入safepoint(特定安全位置),然后再执行相关对象操作。该函数执行的结果是:obj被完全写入到共享内存文件,同时obj内部oop(non-primitive)类型的变量的引用完全指向共享内存内部的对象(被根对象obj引用的数据对象),从而除了klass外,可以不包括任何堆内的对象。此外,调用此函数时,初始化后的头部(meta)也会被更新。值得注意,这个函数只在计算机设备前端被调用。
(3)int JVM_Cache_Load(const char*mmap_file_path,boolean data_read_only=true):
该函数仅会被计算机设备的后端调用,用于将共享内存文件以只读的方式加载至数据访问进程的目标地址空间,当加载成功时,该函数返回0,否则返回-1。在加载完成前,这个函数会对共享内存文件中的头部(meta)和各个片段(segment)里面的元数据magic进行校验,确保共享内存文件没有损坏。
(4)object JVM_Cache_Read(const char*mmap_file_path,int index):
该函数仅会被计算机设备的后端调用,通过指定的目标片段标识(index)从共享内存文件提取出目标片段(segment),也就是待访问数据对象(data)的元数据信息,然后通过目标片段确定待访问数据对象(data)在目标共享空间中的存储地址相对于目标共享空间的第二首地址之间的偏移量,结合共享内存文件在目标地址空间的第一首地址,计算出待访问数据对象的对象地址信息(实际地址),之后,通过对象地址信息直接访问这块内存即可。与此同时,当JVM获取得到待访问数据对象中的初始对象的数据内容时,JVM会对每个待访问数据对象中的每个目标对象调用oop_iterate函数,遍历每个目标对象中的oop类型的成员变量,根据第一首地址和第二首地址,对oop类型的成员变量的值进行修正,得到引用对象的对象位置信息,然后对引用对象位置信息指向的内存区域设置为只读。
(5)JVM_Cache_Madvise(const char*mmap_file_path,int offset):
该函数用以确定共享内存文件里面数据对象不再被使用,需要从LRU cache里面讨论的时候,直接释放所对应的数据对象所占据的物理内存。
(6)int JVM_Cache_Unload(const void*address,const char*mmap_file_path)
当不需要某个共享内存文件后,可以直接调用该函数,把共享内存文件从目标地址空间中完全卸载。
(7)int JVM_Cache_Cleanup(const void*address,const char*mmap_file_path):
做数据清理工作,该函数会释放所有的共享内存文件占据的目标物理内存,并关闭共享内存文件的描述符。
以上仅只是对各关键函数进行简单介绍,关于各函数在具体实施例中的应用,会在后续进行更为详细的说明。
在一个实施例中,提供了一种数据访问方法,本实施例主要以该方法应用于计算机设备102来举例说明。参照图2,该数据访问方法具体包括如下步骤:
步骤S202,获取与待访问对象对应的、且携带有目标索引信息的数据访问指令,待访问对象为写入至目标共享空间中的数据对象的至少一部分,且待访问对象中包括有至少一个目标对象。
其中,待访问对象指的是需要被访问的数据对象,待访问对象包括有至少一个目标对象,每个目标对象存储有相应的数据内容。例如,待访问对象可以为一个存储有多个key-value(键值对)的hashmap(哈希映射),每个键值对可称作一个目标对象,与key相对应的value具体可以为一个java对象。索引信息是用于指示待访问对象中的初始对象在共享内存文件中的位置的信息,初始对象为位于待访问对象首位的目标对象。
目标共享空间指的是用于接收写入的数据对象的计算机内存空间。容易理解地,当一个对象需要被访问时,此对象可称作待访问对象,相应的,当一个对象被写入目标共享空间时,此对象可称作数据对象。其中,待访问对象为写入至目标共享空间中的数据对象的至少一部分,例如,目标共享空间中可存储有10个数据对象,而待访问对象可为10个数据对象中的第三个数据对象。
具体地,当需要获取得到待访问对象中的数据内容时,数据访问方可对应输入待访问对象的目标索引信息,从而计算机设备中的后端可通过目标索引信息确定待访问对象中的初始对象在目标共享空间中的初始位置信息,进而后续可基于初始位置信息访问待访问对象。
在一个实施例中,参考图3,计算机设备包括前端和后端,前端用以向目标共享空间中写入数据对象,后端用以通过数据访问进程对待访问对象进行访问。当确定目标共享空间符合映射条件时,计算机设备可对目标共享空间中的各数据对象进行映射,得到存储于计算机磁盘中的共享内存文件。当需要访问待访问对象之前,后端可将共享内存文件加载至数据访问进程的目标地址空间,得到共享内存文件与目标地址空间之间的对应关系,从而当需要访问待访问对象时,后端中的数据访问进程可基于目标索引信息,确定对应的共享内存文件,并通共享内存文件与目标地址空间之间的对应关系,获取待访问对象的数据内容。图3示出了一个实施例中计算机设备的架构示意图。
在一个实施例中,计算机设备中可存储有多个共享内存文件,当数据写入方将数据对象写入目标共享空间时,数据写入方可记录通过此目标共享空间映射得到的共享内存文件的文件存储路径,从而建立数据对象与文件存储路径之间的关联关系。当数据读取方需要访问待访问对象时,数据读取方可基于数据对象与文件存储路径之间的关联关系,确定与待访问对象相对应的目标文件存储路径,并输入此目标文件存储路径,从而得到包含有文件存储路径的目标索引信息。
在一个实施例中,数据访问指令可以是数据访问进程根据运行需求自动发起的操作指令,也可以是数据访问方根据数据读取的需求,发起的操作指令。本实施例在此不作限定。
在一个实施例中,获取与待访问对象对应的、且携带有目标索引信息的数据访问指令之前,数据访问方法还包括:获取共享内存文件的文件存储路径,通过文件存储路径将对应的共享内存文件加载至目标地址空间,得到目标地址空间的第一首地址;根据目标地址空间的第一首地址,获取共享内存文件中的校验信息,并根据校验信息对共享内存文件的完整性进行校验。
具体地,在访问待访问对象之前,后端的数据访问进程可根据目标索引信息中的共享内存文件的文件存储路径,确定共享内存文件是否加载于对应的目标地址空间中,并在确定未加载于目标地址空间时,将共享内存文件加载至目标地址空间,从而得到共享内存文件在目标地址空间中的第一首地址、以及共享内存文件中的每个数据对象与虚拟地址之间的对应关系。其中,地址空间指的是进程虚拟地址空间,虚拟地址空间对应于多个虚拟地址,这些虚拟地址通过页表(page table)映射至物理内存空间,从而进程可基于虚拟地址读取存储于物理内存空间中的相应数据。参考图3,当将共享内存文件映射至目标地址空间时,数据访问进程可获取得到共享内存文件在目标地址空间中的第一首地址(base),也即得到与共享内存文件中位于第一顺序的数据对象相对应的虚拟地址,数据访问进程还可确定共享内存文件中的各个数据对象与虚拟地址之间的一一对应关系,例如,可确定与第一首地址相邻、且位于第一首地址之后的第二顺序的虚拟地址与共享内存文件中位于第二顺序的数据对象相对应;与第二顺序的虚拟地址相邻、且位于第二顺序的虚拟地址之后的第三顺序的虚拟地址与共享内存文件中的位于第三顺序的数据对象相对应等。
值得注意的,当共享内存文件映射至目标地址空间时,计算机设备仅获取得到虚拟地址与数据对象之间的对应关系,此时并未真正将共享内存文件中的数据内容复制于虚拟地址通过页表映射至的物理内存空间中。
进一步地,当得知共享内存文件中的每个数据对象与虚拟地址之间的对应关系时,数据访问进程可基于此对应关系确定与校验信息相对应的目标虚拟地址,并基于此目标虚拟地址读取共享内存文件中的校验信息,根据校验信息对共享内存文件的完整性进行校验。示例性的,当获取得到校验信息时,数据访问进程可将校验信息与预设的标准信息进行对比,当校验信息与标准信息一致时,判定共享内存文件完整无误;当校验信息与标准信息不一致时,判定共享内存文件被损坏。
在其中一个实施例中,当基于虚拟地址与数据对象之间的对应关系,确定与校验信息相对应的目标虚拟地址时,也即确定与共享内存文件中的校验信息相对应的校验位置信息时,数据访问进程可通过访问内存的方式,直接基于校验位置信息读取相应的校验信息。此时,计算机内核可通过页表查询校验位置信息映射至的物理内存空间,并读取物理内存空间中的校验信息。当确定物理内存空间中未存储有校验信息时,计算机内核会产生缺页异常(page fault),并基于缺页异常将共享内存文件中的校验信息,装载至目标虚拟地址映射至的物理内存空间,将存储于物理内存中的校验信息返回至数据访问进程。
在其中一个实施例中,当共享内存文件被映射至目标地址空间时,数据访问进程可读取共享内存文件中的全部数据对象,并将所读取的全部数据对象存储于相应的物理内存空间中,从而后续数据访问进程可直接读取物理内存中的数据对象。
在其中一个实施例中,当目标共享内存文件未被加载至目标地址空间时,可通过调用下述代码,将目标文件文件加载至目标地址空间:int JVM_Cache_Load(const char*mmap_file_path,boolean data_read_only=true)。其中,mmap_file_path为共享内存文件在磁盘中的文件存储路径。
上述实施例中,通过将共享内存文件映射至目标地址空间,可以得知共享内存文件中的各数据对象与目标地址空间的虚拟地址之间的对应关系,从而后续可基于此对应关系正确查找相应的数据对象。
步骤S204,根据目标索引信息,确定加载有共享内存文件的目标地址空间的第一首地址、及待访问对象中的初始对象在目标共享空间中的初始位置信息;共享内存文件是对目标共享空间中的各数据对象进行映射得到。
其中,目标索引信息包括共享内存文件在磁盘中的文件存储路径以及目标片段标识。目标片段标识为用以指示与待访问对象相对应的目标片段的信息。目标片段指的是存储有待访问对象的元数据的数据段。
在一个实施例中,参考图4,图4示出了一个实施例中共享内存文件的内部布局示意图。共享内存文件包括文件元信息存储区域(meta)、片段存储区域和内容存储区域。其中,文件元信息存储区域为共享内存文件的头部(meta),用以存储共享内存文件的元数据,例如,校验信息(magic)、共享内存文件的头部所占用内存的空间大小(meta_size)、共享内存文件所包含的片段(segment)数量、共享内存文件包含的数据对象(data)所占用内存的空间大小(data_size)、目标共享空间的第二首地址(object_base_address)等。片段存储区域用于存储至少一个片段,片段与数据对象一一对应,例如,片段1(segment1)与数据对象1(data1)相对应,从而片段1中存储有数据对象1的元数据:片段所占用内存的空间大小(segment_size)、对应数据对象中所包含的目标对象的数量(object_count)、至少一个目标对象中的初始对象,在目标共享空间中的存储地址相对于第二首地址的偏移量(first_object_offset_from_meta),等。容易理解地,由于共享内存文件是通过目标共享内存映射而得,因此,共享内存文件为目标共享内存的镜像文件,从而目标共享内存中也包括有如上的文件元信息存储区域(meta)、片段存储区域和内容存储区域、且各存储区域中的数据排布与共享内存文件一致。为了描述方便,下述将文件元信息存储区域中存储的元数据称作文件元数据,将片段存储区域中存储的元数据称作片段元数据。
具体地,当获取得到目标索引信息时,数据访问进程根据目标索引信息确定与待访问对象相对应的目标片段,并基于目标片段中的片段元数据,确定待访问对象中的初始对象的初始位置信息。其中,初始对象指的是待访问对象中的位于第一顺序的目标对象,例如图4中的obj1。初始位置信息指示了初始对象在目标共享空间中的存储地址相对于第二首地址的偏移量。
在一个实施例中,数据访问进程可根据目标索引信息中的文件存储路径、以及文件存储路径与第一首地址之间的对应关系,确定加载有共享内存文件的目标地址空间的第一首地址,并根据第一首地址读取文件元数据,根据文件元数据确定目标共享空间第二首地址。进一步地,数据访问进程根据目标索引信息中的目标片段标识和第二首地址,确定目标片段在目标共享空间中的存储地址,根据第一首地址以及第二首地址对目标片段在目标共享空间中的存储地址进行调整,得到目标片段的片段位置信息,例如,将第二首地址减去第一首地址后再加上目标片段在目标共享空间中的存储位置,得到目标片段的、与目标地址空间相匹配的片段位置信息,从而数据访问进程根据目标片段的片段位置信息,通过调用目标地址空间读取目标片段中的片段内容,也即读取片段元数据,并根据片段元数据确定初始对象在目标共享空间中的初始位置信息。
在一个实施例中,数据访问方可通过以下代码访问待访问对象:object JVM_Cache_Read(const char*mmap_file_path,int index)。其中,mmap_file_path为共享内存文件的文件存储路径;index为目标片段标识。
在一个实施例中,当将数据对象存储至目标共享空间时,数据存储方可对应记录与此数据对象相对应的目标片段的目标片段标识,从而当需要访问此数据对象时,可基于目标片段的目标片段标识生成目标索引信息。
步骤S206,基于第一首地址对初始位置信息进行调整,得到与目标地址空间相匹配的对象位置信息。
步骤S208,根据对象位置信息,并通过调用所述目标地址空间,获取与初始对象对应的数据内容。
具体地,数据访问进程根据第一首地址对初始位置信息进行调整,例如,数据访问进程将第一首地址与初始位置信息进行叠加,得到初始对象的、与目标地址空间相匹配的对象位置信息,并通过调用目标地址空间以访问内存的方式,基于初始对象的对象位置信息,从与目标地址空间相对应的目标物理内存中读取初始对象的数据内容。其中,对象位置信息指的是与目标地址空间相匹配的、且指向对应数据对象的存储地址。容易理解地,当目标物理内存中不存在初始对象的数据内容时,计算机内核会自动将共享内存文件中的初始对象的数据内容加载至目标物理内存的对应位置处。
由于共享内存文件里面存储的数据对象,可以直接映射至数据访问进程,从而可以把数据对象直接从磁盘读到数据访问进程。通过此方法访问数据对象不会走正常的linux io栈,而走正常的linux io栈时,需要对共享内存文件中的数据对象进行至少两次复制之后,才能读取到待访问数据对象的数据内容,因此,本方案还可以大大减少数据复制的次数,从而提升数据读取的效率。
步骤S210,依次对待访问对象中除初始对象之外的各个目标对象进行轮询处理,以得到每个目标对象各自所对应的数据内容;其中,对于每次轮询至的当前目标对象,根据前次轮询至的前序目标对象的对象位置信息,确定当次轮询至的当前目标对象的对象位置信息,并根据当前目标对象的对象位置信息,通过调用目标地址空间,获取与当前目标对象对应的数据内容。
具体地,当读取得到初始对象的数据内容后,数据访问进程依次根据已访问的相应目标对象的对象位置信息,确定对应未访问目标对象的对象位置信息,并根据未访问的目标对象的对象位置信,获取未访问的目标对象的数据内容。
为了便于理解,下述以当前轮询至的当前目标对象为例,进行说明。当需要读取当前轮询至的当前目标对象时,数据访问进程确定前一次轮询至的前序目标对象的对象位置信息、以及预设的目标对象所占用内存的默认空间大小,并根据前序目标对象的对象位置信息和默认空间大小确定当前目标对象的对象位置信息,通过调用目标地址空间,获取与当前目标对象对应的数据内容。例如,可以预先设置各目标对象所占用内存的默认空间大小均为2KB,从而数据访问进程将前一次轮询至的前序目标对象的对象位置信息加上2KB,即可得到当前轮询至的当前目标对象的对象位置信息。
在一个实施例中,对于每次轮询至的当前目标对象,根据前次轮询至的前序目标对象的对象位置信息,确定当次轮询至的当前目标对象的对象位置信息,包括:确定前次轮询至的前序目标对象的对象位置信息和前序目标对象所占用内存的空间大小;基于前序目标对象的对象位置信息和前序目标对象所占用内存的空间大小,确定当次轮询至的当前目标对象的对象位置信息。
具体地,对于前次轮询至的前序目标对象,当获取得到前序目标对象的对象位置信息时,数据访问进程可通过指针存储此对象位置信息,从而后续可基于指针读取前序目标对象的数据内容,基于读取的数据内容确定前序目标对象的所占用空间的空间大小。
对于每次轮询至的当前目标对象,数据访问进程确定前序目标对象所占用内存的空间大小、以及从与前序目标对象相对应的指针中读取对象位置信息,并根据前序目标对象所占用内存的空间大小和前序目标对象的对象位置信息,确定当次轮询至的当前目标对象的对象位置信息,例如,将前序目标对象的对象位置信息与前序目标对象所占用内存的空间大小进行叠加,得到当次轮询至的当前目标对象的对象位置信息。
本实施例中,通过确定前次轮询至的前序目标对象的对象位置信息和前序目标对象所占用内存的空间大小,可以基于前序目标对象的对象位置信息和前序目标对象所占用内存的空间大小准确得知当次轮询至的当前目标对象的对象位置信息,从而后续可基于确得知的当前目标对象的对象位置信息读取当前对象的对象数据。
上述数据访问方法中,通过获取数据访问指令,可以基于数据访问指令中的目标索引信息准确得知初始对象的初始位置信息。通过确定初始位置信息,可基于目标地址空间的第一首地址对初始位置信息进行调整,得到与目标地址空间相匹配的对象位置信息。通过确定对象位置信息,可基于对象位置信息获取初始对象的数据内容,并依次对待访问对象中除初始对象之外的各个目标对象进行轮询处理,以得到每个目标对象各自所对应的数据内容。由于在数据访问的过程中,直接将共享内存文件加载至目标地址空间后,即可通过调用目标地址空间,获取相应数据内容,而无需对任何待访问对象进行序列化和反序列化,相比于传统的需要对待访问对象进行序列化和反序列化后才能获取得到相应的数据内容,本方法可节约计算机资源。
此外,由于在对数据对象进行序列化和反序列化的过程中,会产生大量的临时对象,从而占用大量的内存资源,本方法还可有效减少大量临时对象所占用的内存空间,从而提升内存的利用率。
在一个实施例中,目标索引信息包括共享内存文件的文件存储路径和目标片段标识;根据目标索引信息,确定加载有共享内存文件的目标地址空间的第一首地址、及待访问对象中的初始对象在目标共享空间中的初始位置信息,包括:根据文件存储路径,确定加载有共享内存文件的目标地址空间的第一首地址,并基于第一首地址确定与共享内存文件对应的文件元信息;根据文件元信息和目标片段标识,确定与待访问对象对应的目标片段;根据目标片段的片段内容,确定待访问对象中的初始对象在目标共享空间中的初始位置信息。
具体地,计算机设备中存储有文件存储路径与第一首地址之间的对应关系,当获取得到目标索引信息时,数据访问进程可根据此对应关系和目标索引信息中的文件存储路径,确定加载有共享内存文件的目标地址空间的第一首地址。进一步地,数据访问进程根据第一首地址读取与共享内存文件对应的文件元数据(meta),并根据文件元数据和目标索引信息中的目标片段标识,确定与待访问对象相对应的目标片段,并读取目标片段中的片段内容,根据片段内容确定待访问对象中的初始对象在目标共享空间中的初始位置信息。例如,当获取得到片段内容时,数据访问进程可根据片段内容中的first_object_offset_from_meta,确定初始对象在目标共享空间中的初始位置信息。
本实施例中,由于目标片段中记载有待访问对象中的初始对象的初始位置信息,因此,可基于目标索引信息确定相应的目标片段,从而基于目标片段确定初始位置信息。
在一个实施例中,文件元数据包括共享内存文件中的头部所占用内存的空间大小;根据文件元数据和目标片段标识,确定与待访问对象对应的目标片段,包括:根据目标片段标识和空间大小,确定与待访问对象对应的目标片段在目标共享空间中的第一偏移位置信息;根据第一首地址和第一偏移位置信息,确定与目标片段对应、且与目标地址空间相匹配的片段位置信息;根据目标片段的片段位置信息,确定目标片段的片段内容。
具体地,数据访问进程根据文件元数据中的头部所占用内存的空间大小(meta_size)以及目标片段标识,确定与待访问对象对应的目标片段在目标共享空间中的第一偏移位置信息。其中,第一偏移位置信息为目标片段在目标共享空间中的存储地址相对于第二首地址的偏移量。比如,当得到头部所占用内存的空间大小(meta_size)、目标片段标识(index)、以及确定每个片段所占用内存的空间大小均为4KB时,第一偏移位置信息为:meta_size+(index-1)*4KB。
进一步地,数据访问进程根据第一首地址以及第一偏移位置信息,确定与目标片段对应的、且与目标地址空间相匹配的片段位置信息,并根据片段位置信息,通过调用目标地址空间,读取目标片段的片段内容。例如,数据访问进程将第一首地址与第一偏移位置信息进行叠加,得到片段位置信息,并根据片段位置信息,读取目标片段的片段内容。
本实施例中,通过确定第一首地址以及第一偏移位置信息,可以基于第一一首地址和第一偏移位置信息,确定片段位置信息,从而基于片段位置信息得到目标片段的片段内容。
在一个实施例中,数据访问指令通过数据访问进程触发,根据对象位置信息,并通过调用目标地址空间,获取与初始对象对应的数据内容,包括:响应于数据访问指令,根据与初始对象对应的对象位置信息,并通过数据访问进程调用目标地址空间,从与目标地址空间相对应的目标物理内存中读取初始对象的数据内容并反馈;其中,目标物理内存中的数据内容是通过计算机内核从共享内存文件中调入并存储至的。
具体地,计算机设备的后台中的数据访问进程响应于数据访问指令,并根据初始对象的对象位置信息,调用目标地址空间,从与目标地址空间相对应的目标物理内存中读取初始对象的对象内容并反馈。容易理解地,目标物理内存空间中的数据内容是计算机内核从共享内存文件中调入并存储至的。
在其中一个实施例中,如图5所示,当获取得到数据访问指令时,后台确定对应目标物理内存中是否存储有待访问的数据对象,若存储有待访问的数据对象,后台直接从目标物理内存中读取待访问的数据对象;若未存储有待访问的数据对象,后台判断目标物理内存的内存空间大小是否已达预设值,也即判断是否已达上限。若已达预设值,后台删除目标物理内存中的部分数据对象,从而计算机内核可从共享内存文件中读取待访问数据,并将待访问数据存储于目标物理内存。图5示出了一个实施例中数据访问的流程示意图。
上述实施例中,由于是将数据对象存储于共享内存文件,并将共享内存文件加载至目标地址空间,通过目标地址空间读取数据内容,相比于传统的将数据存储于堆内,并通过IO流(InputStream-OuputStream)从堆内读取相应数据,本方法还可降低在IO操作过程中的内存拷贝开销。
在一个实施例中,从与目标地址空间相对应的目标物理内存中读取初始对象的数据内容并反馈之后,上述数据访问方法还包括:当与目标地址空间相对应的目标物理内存中的待访问对象符合删除条件时,将待访问对象从目标物理内存中删除。
具体地,当计算机设备后台确定预设时间段内目标物理内存中的待访问对象未被访问时,例如,当确定在一周内,待访问对象一直未被数据访问进程访问时,后台可确定此待访问对象符合删除条件,并将该待访问对象从目标物理内存中对应删除。容易理解地,可通过数据访问进程删除待访问对象,也可通过其他进程删除待访问对象,例如通过删除进程删除待访问对象。本实施例在此不作限定。容易理解地,计算机设备仅删除待访问对象,不将与待访问对象相对应的目标片段从目标物理内存中删除。
在其中一个实施例中,当后台确定在预设时间段内,共享内存文件未被访问时,后台可将目标物理内存中与该共享内存文件相对应的数据内容全部删除。
在其中一个实施例中,数据访问方还可通过以下代码删除待发那个文对象:JVM_Cache_Madvise(const char*mmap_file_path,int offset)。其中,offset为待删除的访问对象在目标共享空间中的存储地址相对于第二首地址的偏移量。
在其中一个实施例中,数据访问方还可通过以下代码将与共享内存文件相对应的数据内容从目标物理内存中全部删除:int JVM_Cache_Cleanup(const void*address,const char*mmap_file_path)。其中,address为第一首地址;mmap_file_path为文件存储路径。
在其中一个实施例中,数据访问方还可通过以下代码将共享内存文件从目标地址空间中卸载:int JVM_Cache_Cleanup(const void*address,const char*mmap_file_path)。address为第一首地址;mmap_file_path为文件存储路径。
在其中一个实施例中,后台还可实时监控目标物理内存的内存大小,当目标物理内存的内存大小超出预设值时,为了保障计算机设备的正常运行,后台可对应删除目标物理内存中的部分数据对象。
现有技术中还可将数据存储于堆内,直接借助JVM的GC(Garbage Collection,垃圾回收)机制清理数据,但是这样由于不能减少堆的大小,所以理论上不会减少GC时间,降低GC压力。本方案JVM进行了改造,使得我们可以把原来一些放到堆内的数据,放到堆外的内存,而且这部分数据是不经过堆,直接通过共享内存文件加载进数据访问进程,因此可以不受GC的管理,故而本方案可以大大减少堆大小,从而降低GC的时间。
上述实施例中,通过将数据对象从目标物理内存中对应删除,可以提升目标物理内存的利用率。此外,由于可以对应删除特定的数据对象,相比于传统的将数据存储于固定大小的堆内,而将堆内的数据一次性删除,本实施例可大大减少删除数据时所耗费的时间,从而提升数据删除的删除效率。再者,由于本申请可直接将数据对象存储于共享内存文件,以及直接读取共享内存文件中的数据对象,相比于传统的需要对数据对象进行序列化和反序列化,才能读取到数据对象,本实施例可以大大减少序列化和反序列化的过程中所产生的大量临时对象,从而免去删除临时对象所耗费的时间,进一步提升了数据删除的删除效率。
在一个实施例中,根据当前目标对象的对象位置信息,通过调用目标地址空间,获取与当前目标对象对应的数据内容,包括:根据当前目标对象的对象位置信息,通过调用目标地址空间,获取当前目标对象中的数据内容;当当前目标对象中的数据内容表征当前目标对象引用了至少一层的引用对象时,基于各层引用对象各自所对应的引用位置信息,确定各层引用对象各自所包括的数据内容;将当前目标对象中的数据内容和各层引用对象各自所包括的数据内容,共同作为与当前目标对象对应的数据内容。
其中,引用对象指的是被目标对象直接或者间接引用的数据对象。
具体地,共享内存文件中可存储有目标对象和目标对象所引用的各层级的引用对象。可将目标对象和目标对象所引用的各层级的引用对象看成一个由“边”和“结点”组成的对象树,其中,目标对象为对象树中的根结点,被目标对象引用的引用对象构成了与根结点直接连接的、且位于根结点下一层级(第一层级)的结点;被第一层级的结点所对应的引用对象所引用的引用对象构成了第二层级的结点。依次类推,直至,最终层级的结点。为了描述方便,下述将构成第一层级结点的引用对象称作第一层级的引用对象,将构成第二层级结点的引用对像称作第二层级的引用对象,依次类推,直至最终层级的引用对象。
当后台根据当前目标对象的对象位置信息,通过调用目标地址空间,获取当前目标对象中的数据内容时,后台可对数据内容进行分析,确定当前目标对象是否具有引用对象,当基于数据内容确定当前目标对象引用了引用对象时,后台确定各层引用对象对应的引用位置信息,并根据引用位置信息,确定各层引用对象各自所包括的数据内容,将当前目标对象中的数据内容和各层引用对象各自所包括的数据内容,共同作为与当前目标对象对应的数据内容。其中,引用位置信息指的是引用对象在目标共享空间中的存储地址。
在其中一个实施例中,当将待写入的数据对象写入目标共享内存时,前端可通过广度遍历的方法获取待写入数据对象所引用的各个引用对象,并将各引用对象存储于目标共享内存中。进一步地,前端确定各个引用对象在目标共享空间中的存储位置,并将各个引用对象在目标共享空间中的存储位置作为引用位置信息写入待写入的数据对象中,从而待写入的数据对象可包含有引用对象的引用位置信息。同理,当前层级的引用对象中也可包含所引用的下一层级的引用对象的引用位置信息。
在其中一个实施例中,一个数据对象可包含有至少一个存储对象,例如,一个数据对象可以为一个存储有多个key-value(键值对)的hashmap(哈希映射),每个键值对可称作一个存储对象。前端可确定待写入的数据对象中的各个存储对象,以及各存储对象所引用的引用对象,并将存储对象以及引用对象存储于目标共享内存中,以及将引用对象的引用位置信息写入相应存储对象中。前端也可将全部的引用对象的引用位置信息统一存储于待写入的数据对象的初始对象中。本实施例在此不作限定。
在其中一个实施例中,可通过特定类型的成员变量存储引用对象的引用位置信息,例如,可通过oop(non-primitive,非原始类型)类型的成员变量存储引用对象的引用位置信息,从而当需要确定当前目标对象是否具有引用对象时,可通过函数oop_iterate对目标对象的数据内容进行遍历,确定其中是否包含有非原始数据类型的成员变量,并将非原始数据类型的成员变量中的数值作为对应的引用位置信息。
本实施例中,通过获取当前目标对象的数据内容,可根据数据内容确定当前目标对象是否具有引用对象,从而在确定具有引用对象时,读取引用对象的数据内容。如此,便能使得所读取的数据内容更为全面。
在一个实施例中,当当前目标对象中的数据内容表征当前目标对象引用了至少一层的引用对象时,基于各层引用对象各自所对应的引用位置信息,确定各层引用对象各自所包括的数据内容,包括:当当前目标对象中的数据内容表征当前目标对象引用了至少一层的引用对象时,对于每层的引用对象,分别基于第一首地址、以及目标共享空间的第二首地址中的至少一种,对相应层级的引用对象的引用位置信息进行调整,得到相应层级的引用对象所对应的、且与目标地址空间相匹配的对象位置信息;根据每个层级的引用对象各自所对应的对象位置信息,并通过调用目标地址空间,获取与每个层级的引用对象各自对应的数据内容。
具体地,在当前目标对象中的数据内容表征当前目标对象引用了至少一层的引用对象时,即在当前目标对象的数据内容中存储有引用对象在目标共享空间中的存储地址时,后端确定第一首地址以及第二首地址,并根据第一首地址和第二首地址对各引用对象的引用位置信息进行调整,得到相应层级的引用对象所对应的、且与目标地址空间相匹配的对象位置信息,并根据对象位置信息获取与每个层级的引用对象各自对应的数据内容。
在其中一个实施例中,后端确定第一首地址与第二首地址之间的地址差值,并根据地址差值以及引用对象的引用位置信息,确定对应引用对象的对象位置信息。例如,后端将第二首地址减去第一首地址,得到地址差值,并将地址差值与引用对象的引用位置信息进行叠加,得到对应引用对象的对象位置信息。
在其中一个实施例中,后端可将第二首地址减去引用对象的引用位置信息,得到引用对象在目标共享空间中的存储地址相对于第二首地址的偏移量,并将引用对象在目标共享空间中的存储地址相对于第二首地址的偏移量与第一首地址进行叠加,得到对应的对象位置信息。
在其中一个实施例中,当加载与数据对象对应的类时,JVM会创建一个klass实例,klass实例中保存了类中所定义的一切信息,包括变量、方法、父类、接口、构造函数等,而oop类型的成员变量中包含了一个指针,该指针指向klass实例,通过这个指针,JVM便能在运行期间获取数据对象的类元信息。由于JDK8针对java核心的类库已经有了CDS(ClassData Sharing,内容分发服务)功能,CDS使用的是一个包含了核心类的内部表示的内存映射文件,在数据访问进程实际运行时,这个内存映射文件会被JVM直接映射到地址0x800000000,这样,在不同的数据访问进程的里面,数据文件里面的指向klass实例的指针不需要更新,即可以直接使用,后续只需修正引用对象的引用位置信息即可。
在更低版本的JDK上,可以通过在每个片段存储区域增加一个类存储区域,用于存储对应数据对象中的存储对象的klass实例的实例标识,在后端,当把内存共享内存文件映射进目标地址空间以后,可以依据目标索引信息找到对应的目标片段,并从目标片段中的类存储区域中提取klass实例的实例标识,基于klass实例的实例标识找到相应的指针,对指向自身的指针进行更新即可,将其更新为以地址0x800000000为基准的目标地址。
上述实施例中,通过第一首地址、以及目标共享空间的第二首地址中的至少一种对引用位置信息进行调整,使得调整后的对象位置信息可以与目标地址空间相匹配,从而后续可直接基于对象位置信息读取各引用对象。
在一个实施例中,当当前目标对象中的数据内容表征当前目标对象引用了至少一层的引用对象时,基于各层引用对象各自所对应的引用位置信息,确定各层引用对象各自所包括的数据内容,包括:当当前目标对象中的数据内容包括当前目标对象在当前层级所引用的引用对象的引用位置信息时,基于第一首地址、以及目标共享空间的第二首地址中的至少一种,对当前层级的引用对象的引用位置信息进行调整,得到当前层级的引用对象所对应的、且与目标地址空间相匹配的对象位置信息;根据当前层级的引用对象的对象位置信息,并通过调用目标地址空间,获取与当前层级的引用对象对应的数据内容;当当前层级的引用对象中的数据内容包括下一层级的引用对象在目标共享空间中的引用位置信息时,将下一层级的引用对象作为下一轮的当前层级的引用对象,返回基于第一首地址、以及目标共享空间的第二首地址中的至少一种,对当前层级的引用对象的引用位置信息进行调整,得到当前层级的引用对象所对应的、且与目标地址空间相匹配的对象位置信息的步骤继续执行,直至得到最终层级的引用对象的数据内容为止。
具体地,当获取得到当前目标对象的数据内容时,后端可根据数据内容确定当前目标所引用的当前层级的引用对象的引用位置信息,并根据第一首地址、以及第二首地址中的至少一种,对当前层级的引用对象的引用位置信息进行调整,得到当前层级的引用对象所对应的、且与目标地址空间相匹配的对象位置信息,并基于当前层级的引用对象的对象位置信息,得到当前层级的引用对象的数据内容。当确定当前层级的引用对象中包含有下一层级的引用对象在目标共享空间中的引用位置信息时,后端根据根据第一首地址、以及第二首地址中的至少一种,对下一层级的引用对象的引用位置信息进行调整,得到下一层级的引用对象的对象位置信息,并基于下一层级的对象位置信息读取下一层级的引用对象的数据内容。如此迭代,直至得到最终层级的应用对象的数据内容。
本实施例中,通过读取各层级引用对象的数据内容,使得最终获取得到的待访问对象的数据内容更为全面。
在一个实施例中,待访问对象为OLAP引擎组件通过大数据平台采集的商品交易数据;数据访问方法还包括:当获取得到与待访问对象对应的目标商品交易数据时,对目标商品交易数据进行多维度分析,得到商品交易分析报告。
其中,OLAP(OnlineAnalyticalProcessing,联机分析处理)是专门用于处理复杂的数据分析,其可以根据分析人员的要求快速、灵活地进行大数据量的复杂查询处理,并且将查询结果提供给数据访问方,以便他们准确掌握企业的经营状况,了解对象的需求,制定正确的方案。
具体地,可通过OLAP引擎组件获取商品交易数据,并将商品交易数据通过上述方式映射为共享内存文件。当需要对商品交易数据进行分析时,可将共享内存文件加载至目标地址空间,并按照内存查询的方式,读取待访问的目标商品交易数据。进一步地,计算机设备可获取预设的数据分析模型,通过数据分析模型对目标商品交易数据进行分析,得到商品交易分析报告并反馈。
本实施例中,通过获取待访问的目标商品交易数据,并生成与目标商品交易数据对应的商品交易分析报告,使得数据访问方可基于商品交易分析报告从多维度得知商品交易情况。此外,由于是通过共享内存文件读取目标商品交易数据,因此,可提升获取目标商品交易数据的获取效率。
在一个实施例中,提供了一种数据存储方法,本实施例主要以该方法应用于计算机设备来举例说明,该计算机设备可以是上述图1中的终端102或服务器104。参照图6,该数据存储方法具体包括如下步骤:
步骤S602,获取待写入的数据对象,并确定与数据对象相对应的目标共享空间;目标共享空间包括内容存储区域和片段存储区域。
步骤S604,将数据对象写入目标共享空间中的内容存储区域。
其中,内容存储区域可存储有至少一个数据对象,片段存储区域可存储有至少一个片段。片段与数据对象呈一一对应关系,一个数据对象可包含有至少一个存储对象,例如,一个数据对象可以为一个存储有多个key-value(键值对)的hashmap(哈希映射),每个键值对可称作一个存储对象。
具体地,前端可预先申请预设大小的目标共享空间,从而计算机内核可在目标共享空间申请成功时,向前端返回目标共享空间的第二首地址。进一步地,数据写入方可对申请成功的目标共享空间进行划分,将其划分为用以存储数据对象的内存存储区域和用以存储片段的片段存储区域,从而当数据写入方输入待写入的数据对象时,前端可根据第二首地址将数据对象写入目标共享空间中的内容存储区域。
在一个实施例中,前端可通过以下代码申请目标共享空间:void*JVM_Cache_Init(size_t size)。其中,size_t size为目标共享空间的空间大小,例如为40GB。容易理解地,目标共享空间位于堆外,不受JVM(Java Virtual Machine,Java执行引擎)的垃圾回收机制的管理。
步骤S606,生成与数据对象相对应的原始片段,并将原始片段写入共享内存空间的片段存储区域。
具体地,当将数据对象写入内容存储区域时,前端可对应生成与此数据对象相对应的原始片段,并将原始片段写入片段存储区域。例如,生成一个包含有片段所占用内存的空间大小(segment_size)、对应数据对象中所包含的目标对象的数量(object_count)、至少一个目标对象中的初始对象,在目标共享空间中的存储地址相对于第二首地址的偏移量(first_object_offset_from_meta)的原始片段,其中,原始片段中的segment_size、object_count以及first_object_offset_from_meta均为随机值。
步骤S608,根据目标共享空间的第二首地址、以及数据对象中的初始存储对象在目标共享空间中的初始存储地址,确定初始存储对象在目标共享空间中的第二偏移位置信息。
步骤S610,根据第二偏移位置信息,对原始片段中的片段元信息进行调整,得到与数据对象对应的目标片段;其中,目标片段中的片段元信息用于指示数据对象中的初始存储对象在目标共享空间中的存储位置。
具体地,前端根据目标共享空间的第二首地址、以及数据对象中的初始存储对象在目标共享空间中的初始存储地址,确定初始存储对象在目标共享空间中的第二偏移位置信息。例如,前端将第二首地址减去初始存储对象在目标共享空间中的初始存地址,得到第二偏移位置信息。其中,初始对象指的是存储于目标共享空间中的数据对象中的位于第一顺序的存储对象;初始存储地址指的是初始对象在目标共享空间中的存储地址;第二偏移位置信息指的是初始对象在目标空间中的存储地址相对于第二首地址的偏移量。
进一步地,前端可根据第二偏移位置信息对,原始片段中的片段元信息进行调整,得到与数据对象对应的目标片段。例如,将原始片段中的first_object_offset_from_meta的值修改为第二偏移位置信息,从而当需要读取待访问数据时,后端可根据目标片段中的片段元信息,确定待访问对象中的初始对象在目标共享空间中的存储位置。
在一个实施例中,前端还可对应调整原始片段中的片段所占用内存的空间大小(segment_size)、以及对应数据对象中所包含的目标对象的数量(object_count),将随机值调整为实际值,得到与数据对象对应的目标片段。
上述数据存储方法,通过将数据对象写入目标共享空间中的内容存储区域以及将所生成原始片段存储于片段存储区域,可以基于根据目标共享空间的第二首地址和初始存储地址,对原始片段进行调整,得到数据对象对应的目标片段。通过得到目标片段,可以在需要对数据对象进行访问时,基于目标片段数据对象中的初始存储对象在目标共享空间中的存储位置。由于可以直接将数据对象存储于目标内存空间,以及通过目标片段直接读取数据对象,相比于传统的需要对待访问对象进行序列化和反序列化后才能获取得到相应的数据内容,本方法无需进行任何序列化和反序列化,从而节约计算机资源。
在一个实施例中,将数据对象写入目标共享空间中的内容存储区域,包括:确定数据对象中的每个存储对象分别引用的引用对象;将存储对象和引用对象,写入内容存储区域。
具体地,当获取得到待写入的数据对象时,前端可以此数据对象为根对象,将根对象以及根对象所引用的全部引用对象均写入内容存储区域,也即将数据对象中的每个存储对象、以及每个存储对象分别引用的引用对象均写入内容存储区域。例如,在上述举例中,当需要将存储有多个key-value(键值对)的hashmap(哈希映射)存储于目标共享空间中时,前端除了将各键值对存储于内容存储区域,还可将各键值对所引用的引用对象存储于内容存储区域。
在其中一个实施例中,前端可通过以下代码将待写入的数据对象写入目标共享空间:int JVM_Cache_write(Object obj),其中,obj为数据对象,例如为上述举例中的hashmap。
上述实施例中,通过将存储对象以及存储对象所引用的引用对象均写入内容存储区域,使得后续读取的待访问对象的数据内容更为全面。
在一个实施例中,生成与数据对象相对应的原始片段,并将原始片段写入共享内存空间的片段存储区域,包括:生成与数据对象相对应的原始片段;确定片段存储区域中已存储的、且位于最后顺序的片段在目标共享空间中的已占用位置信息;根据已占用位置信息,确定片段存储区域中的目标未占用位置,并将原始片段写入目标未占用位置处。
具体地,当生成原始片段时,前端确定片段存储区域中已存储的、且位于最后顺序的片段在目标共享空间中的已占用位置信息。其中,已占用位置信息指的是最后顺序的片段在目标共享空间中的存储地址。进一步地,前端根据已占用位置信息,确定片段存储区域中的目标为占用位置,并将原始片段写入目标未占用位置处。例如,前端将原始片段写入已占用位置之后,也即将原始片段写入最后顺序的片段之后。
本实施例中,通过确定已占用位置信息,可以基于已占用位置信息将原始片段写入目标未占用位置处,从而使得各原始片段均能存储于正确位置处,而不会覆盖已存储的片段。
在一个实施例中,目标共享空间包括文件元信息存储区域;方法还包括:当数据对象被写入至目标共享空间中的内容存储区域中时,读取存储于文件元信息存储区域中的片段总数量和数据总量;分别对片段总数量和数据总量进行数值的增加。
具体地,目标共享空间还可包括有文件元信息存储区域,用于存储共享内存文件的元数据。当申请目标共享空间时,数据存储方可对应划分文件元信息存储区域,从而前端可初始化文件元数据,并将初始化的文件元数据存储于文件元信息存储区域。进一步地,当将数据对象写入内容存储区域时,前端获取数据对象所包含的存储对象数量,并根据存储对象数量对文件元信息存储区域中的数据总量进行调整,例如,将文件元信息存储区域中的数据总量与存储对象数量进行叠加,得到调整后的数据总量。以及前端对文件元信息存储区域中的片段总数量进行调整,例如,将片段总数量加1,得到调整后的片段总数量。
本实施例中,通过调整文件元信息中的片段总数量和数据总量,使得调整后的片段总数量和数据总量可以指向正确的真实值,从而可基于真实值进行后续处理。
在一个实施例中,上述数据访问方法还包括:当目标共享空间符合映射条件时,根据预设的文件存储路径,将存储于目标共享空间中的数据对象映射至磁盘,得到存储于磁盘中的共享内存文件。
具体地,前端判断目标共享空间是否符合映射条件,并在确定符合映射条件时,根据预设的文件存储路径,将存储于目标共享空间中的数据对象映射至计算机磁盘,得到存储路径为预设的文件存储路径的共享内存文件。
在其中一个实施例中,当目标共享空间所占用的空间大小达到预设值时,前端对存储于目标共享空间中的数据对象进行映射,得到共享内存文件。
在其中一个实施例中,当预设时间段内,不具有新的数据对象写入目标共享空间时,可以认为数据写入方不再需要对目标共享空间进行操作,此时前端对存储于目标共享空间中的数据对象进行映射,得到共享内存文件。
上述实施例中,通过判断目标共享空间是否符合映射条件,可以在符合映射条件时,及时对存储于目标共享空间中的数据对象进行映射,从而得到共享内存文件。
在一个实施例中,如图7所示,提供了一个具体实施例中数据访问方法的流程示意图:
S702,获取共享内存文件的文件存储路径,通过文件存储路径将对应的共享内存文件加载至目标地址空间,得到目标地址空间的第一首地址;根据目标地址空间的第一首地址,获取共享内存文件中的校验信息,并根据校验信息对共享内存文件的完整性进行校验。
S704,获取与待访问对象对应的、且携带有目标索引信息的数据访问指令,待访问对象为写入至目标共享空间中的数据对象的至少一部分,且待访问对象中包括有至少一个目标对象。
S706,目标索引信息包括共享内存文件的文件存储路径和目标片段标识;共享内存文件是对目标共享空间中的各数据对象进行映射得到;根据文件存储路径,确定加载有共享内存文件的目标地址空间的第一首地址,并基于第一首地址确定与共享内存文件对应的文件元数据。
S708,文件元数据包括共享内存文件中的头部所占用内存的空间大小;根据目标片段标识和空间大小,确定与待访问对象对应的目标片段在目标共享空间中的第一偏移位置信息。
S710,根据第一首地址和第一偏移位置信息,确定与目标片段对应、且与目标地址空间相匹配的片段位置信息;根据目标片段的片段位置信息,确定目标片段的片段内容。
S712,根据目标片段的片段内容,确定待访问对象中的初始对象在目标共享空间中的初始位置信息。基于第一首地址对初始位置信息进行调整,得到与目标地址空间相匹配的对象位置信息。
S714,数据访问指令通过数据访问进程触发;响应于数据访问指令,根据与初始对象对应的对象位置信息,并通过数据访问进程调用目标地址空间,从与目标地址空间相对应的目标物理内存中读取初始对象的数据内容并反馈;其中,目标物理内存中的数据内容是通过计算机内核从共享内存文件中调入并存储至的。
S716,依次对待访问对象中除初始对象之外的各个目标对象进行轮询处理,以得到每个目标对象各自所对应的数据内容;其中,确定前次轮询至的前序目标对象的对象位置信息和前序目标对象所占用内存的空间大小;基于前序目标对象的对象位置信息和前序目标对象所占用内存的空间大小,确定当次轮询至的当前目标对象的对象位置信息。
S718,根据当前目标对象的对象位置信息,通过调用目标地址空间,获取当前目标对象中的数据内容;当当前目标对象中的数据内容表征当前目标对象引用了至少一层的引用对象时,对于每层的引用对象,分别基于第一首地址、以及目标共享空间的第二首地址中的至少一种,对相应层级的引用对象的引用位置信息进行调整,得到相应层级的引用对象所对应的、且与目标地址空间相匹配的对象位置信息。
S720,根据每个层级的引用对象各自所对应的对象位置信息,并通过调用目标地址空间,获取与每个层级的引用对象各自对应的数据内容;将当前目标对象中的数据内容和各层引用对象各自所包括的数据内容,共同作为与当前目标对象对应的数据内容。
S722,当与目标地址空间相对应的目标物理内存中的待访问对象符合删除条件时,将待访问对象从目标物理内存中删除。
上述数据访问方法中,通过获取数据访问指令,可以基于数据访问指令中的目标索引信息准确得知初始对象的初始位置信息。通过确定初始位置信息,可基于目标地址空间的第一首地址对初始位置信息进行调整,得到与目标地址空间相匹配的对象位置信息。通过确定对象位置信息,可基于对象位置信息获取初始对象的数据内容,并依次对待访问对象中除初始对象之外的各个目标对象进行轮询处理,以得到每个目标对象各自所对应的数据内容。由于在数据访问的过程中,直接将共享内存文件加载至目标地址空间后,即可通过调用目标地址空间,获取相应数据内容,而无需对任何待访问对象进行序列化和反序列化,相比于传统的需要对待访问对象进行序列化和反序列化后才能获取得到相应的数据内容,本方法可大大提升数据访问的访问效率。
此外,由于在对数据对象进行序列化和反序列化的过程中,会产生大量的临时对象,从而占用大量的内存资源,本方法还可有效减少大量临时对象所占用的内存空间,从而提升内存的利用率。
在一个实施例中,如图8所示,提供了一个具体实施例中数据存储方法的流程示意图:
S802,获取待写入的数据对象,并确定与数据对象相对应的目标共享空间;目标共享空间包括内容存储区域和片段存储区域。
S804,确定数据对象中的每个存储对象分别引用的引用对象;将存储对象和引用对象,写入内容存储区域。
S806,生成与数据对象相对应的原始片段;确定片段存储区域中已存储的、且位于最后顺序的片段在目标共享空间中的已占用位置信息;根据已占用位置信息,确定片段存储区域中的目标未占用位置,并将原始片段写入目标未占用位置处。
S808,根据目标共享空间的第二首地址、以及数据对象中的初始存储对象在目标共享空间中的初始存储地址,确定初始存储对象在目标共享空间中的第二偏移位置信息。
S810,根据第二偏移位置信息,对原始片段中的片段元信息进行调整,得到与数据对象对应的目标片段;其中,目标片段中的片段元信息用于指示数据对象中的初始存储对象在目标共享空间中的存储位置。
S812,当数据对象被写入至目标共享空间中的内容存储区域中时,读取存储于文件元信息存储区域中的片段总数量和数据总量;分别对片段总数量和数据总量进行数值的增加。
S814,当目标共享空间符合映射条件时,根据预设的文件存储路径,将存储于目标共享空间中的数据对象映射至磁盘,得到存储于磁盘中的共享内存文件。
为了便于本领域技术人员的理解,下述对本申请进行一个整体阐述:
计算机设备前端(client端)可通过接口(JVM_Cache_Init)将数据对象存储于预先申请的堆外内存(目标共享内存)中,从而当确定目标共享内存中的数据对象符合加载条件时,将目标共享内存中的数据对象加载至计算机磁盘,得到共享内存文件。当需要读取数据对象时,计算机设备后端(server端)可通过接口(JVM_Cache_Read)读取数据对象,此时,数据访问进程会判断目标物理内存中是否存在此待访问数据对象,若存在,则通过访问内存的方式直接读取,若不存在,计算机内核会将待访问数据对象从目标共享文件加载至目标物理内存,从而数据访问可从目标物理内存中读取待访问数据对象。
在后端,从磁盘读取数据时候,由于可调用共享内存文件直接读取,相比于传统的通过JVM提供的io函数读数据的方式更为高效,且本方案用户态和内核态共用一块内存,因此读取的数据对象不需要多次经过用户态的缓存空间,从而提升了数据读取的效率。
在后端把数据对象从磁盘映射进目标地址空间的过程中,不需要对数据对象进行任何的反序列化操作,即可让前端传递过来的数据对象在数据访问进程中可用,如此,避免了通过序列化和反序列化来的读取数据对象的缺点,从而有效的降低了GC压力。
由于共享内存文件所占用的内存完全在JVM Heap之外,在JVM GC线程管理之外,通过该技术手段,可以有效降低堆大小,减少全局GC的停机(Stop the World)时间。
本申请还提供一种应用场景,该应用场景应用上述的数据访问方法。具体地,该数据访问方法在该应用场景的应用如下:
数据写入方可将商品交易平台所产生的大量商品交易数据存储至目标共享空间,并将目标共享空间中的商品交易数据进行映射得到共享内存文件。当需要读取目标商品交易数据时,数据访问方可输入目标索引信息,从而计算机后台可基于目标索引信息确定与待访问对象相对应的对象位置信息,并基于对象位置信息读取目标商品交易数据。当获取得到目标商品交易数据时,计算机设备可对目标商品交易数据进行多维度分析处理,从而得到商品交易分析报告。
本申请还另外提供一种应用场景,该应用场景应用上述的数据访问方法。具体地,该数据访问方法在该应用场景的应用如下:
数据写入方可按照上述方式将页面访问数据输入至目标共享空间,从而计算机后台可基于上述方式,通过加载了共享内存文件的目标地址空间读取目标页面访问数据,进而可基于所读取的目标页面访问数据进行后续处理,例如生成页面访问报告。
可以理解,上述的应用场景仅用于对本申请的方案进行说明,本申请中的数据访问方法和/或数据存储方法还可以适用于其他的场景中,不做限定。比如,对应用程序采集的用户数据进行存储和/或访问,以实现用户画像的构建。还比如对媒体数据(如音视频数据)进行数据访问和/或数据存储,以基于访问到的媒体数据进行后续处理,比如进行媒体数据的分类或推荐等。
应该理解的是,虽然图2、6-8的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图2、6-8中的至少一部分步骤可以包括多个步骤或者多个阶段,这些步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤中的步骤或者阶段的至少一部分轮流或者交替地执行。
在一个实施例中,如图9所示,提供了一种数据访问装置900,该装置可以采用软件模块或硬件模块,或者是二者的结合成为计算机设备的一部分,该装置具体包括:初始位置确定模块902、初始对象获取模块904和目标对象获取模块906,其中:
初始位置确定模块902,用于获取与待访问对象对应的、且携带有目标索引信息的数据访问指令,待访问对象为写入至目标共享空间中的数据对象的至少一部分,且待访问对象中包括有至少一个目标对象;根据目标索引信息,确定加载有共享内存文件的目标地址空间的第一首地址、及待访问对象中的初始对象在目标共享空间中的初始位置信息;共享内存文件是对目标共享空间中的各数据对象进行映射得到。
初始对象获取模块904,用于基于第一首地址对初始位置信息进行调整,得到与目标地址空间相匹配的对象位置信息;根据对象位置信息,并通过调用目标地址空间,获取与初始对象对应的数据内容。
目标对象获取模块906,用于依次对待访问对象中除初始对象之外的各个目标对象进行轮询处理,以得到每个目标对象各自所对应的数据内容;其中,对于每次轮询至的当前目标对象,根据前次轮询至的前序目标对象的对象位置信息,确定当次轮询至的当前目标对象的对象位置信息,并根据当前目标对象的对象位置信息,通过调用目标地址空间,获取与当前目标对象对应的数据内容。
在一个实施例中,目标索引信息包括共享内存文件的文件存储路径和目标片段标识;初始位置确定模块902还包括目标片段确定模块9021,用于根据文件存储路径,确定加载有共享内存文件的目标地址空间的第一首地址,并基于第一首地址确定与共享内存文件对应的文件元数据;根据文件元数据和目标片段标识,确定与待访问对象对应的目标片段;根据目标片段的片段内容,确定待访问对象中的初始对象在目标共享空间中的初始位置信息。
在一个实施例中,文件元数据包括共享内存文件中的头部所占用内存的空间大小;目标片段确定模块9021还用于根据目标片段标识和空间大小,确定与待访问对象对应的目标片段在目标共享空间中的第一偏移位置信息;根据第一首地址和第一偏移位置信息,确定与目标片段对应、且与目标地址空间相匹配的片段位置信息;根据目标片段的片段位置信息,确定目标片段的片段内容。
在一个实施例中,数据访问指令通过数据访问进程触发,初始对象获取模块904还用于响应于数据访问指令,根据与初始对象对应的对象位置信息,并通过数据访问进程调用目标地址空间,从与目标地址空间相对应的目标物理内存中读取初始对象的数据内容并反馈;其中,目标物理内存中的数据内容是通过计算机内核从共享内存文件中调入并存储至的。
在一个实施例中,数据访问装置900还包括删除模块908,用于当与目标地址空间相对应的目标物理内存中的待访问对象符合删除条件时,将待访问对象从目标物理内存中删除。
在一个实施例中,目标对象获取模块906还用于确定前次轮询至的前序目标对象的对象位置信息和前序目标对象所占用内存的空间大小;基于前序目标对象的对象位置信息和前序目标对象所占用内存的空间大小,确定当次轮询至的当前目标对象的对象位置信息。
在一个实施例中,目标对象获取模块906包括引用对象获取模块9061,用于根据当前目标对象的对象位置信息,通过调用目标地址空间,获取当前目标对象中的数据内容;当当前目标对象中的数据内容表征当前目标对象引用了至少一层的引用对象时,基于各层引用对象各自所对应的引用位置信息,确定各层引用对象各自所包括的数据内容;将当前目标对象中的数据内容和各层引用对象各自所包括的数据内容,共同作为与当前目标对象对应的数据内容。
在一个实施例中,引用对象获取模块9061还用于当当前目标对象中的数据内容表征当前目标对象引用了至少一层的引用对象时,对于每层的引用对象,分别基于第一首地址、以及目标共享空间的第二首地址中的至少一种,对相应层级的引用对象的引用位置信息进行调整,得到相应层级的引用对象所对应的、且与目标地址空间相匹配的对象位置信息;根据每个层级的引用对象各自所对应的对象位置信息,并通过调用目标地址空间,获取与每个层级的引用对象各自对应的数据内容。
在一个实施例中,引用对象获取模块9061还用于当当前目标对象中的数据内容包括当前目标对象在当前层级所引用的引用对象的引用位置信息时,基于第一首地址、以及目标共享空间的第二首地址中的至少一种,对当前层级的引用对象的引用位置信息进行调整,得到当前层级的引用对象所对应的、且与目标地址空间相匹配的对象位置信息;根据当前层级的引用对象的对象位置信息,并通过调用目标地址空间,获取与当前层级的引用对象对应的数据内容;当当前层级的引用对象中的数据内容包括下一层级的引用对象在目标共享空间中的引用位置信息时,将下一层级的引用对象作为下一轮的当前层级的引用对象,返回基于第一首地址、以及目标共享空间的第二首地址中的至少一种,对当前层级的引用对象的引用位置信息进行调整,得到当前层级的引用对象所对应的、且与目标地址空间相匹配的对象位置信息的步骤继续执行,直至得到最终层级的引用对象的数据内容为止。
在一个实施例中,数据访问装置900还用于获取共享内存文件的文件存储路径,通过文件存储路径将对应的共享内存文件加载至目标地址空间,得到目标地址空间的第一首地址;根据目标地址空间的第一首地址,获取共享内存文件中的校验信息,并根据校验信息对共享内存文件的完整性进行校验。
在一个实施例中,待访问对象为OLAP引擎组件通过大数据平台采集的商品交易数据;数据访问装置900还用于当获取得到与待访问对象对应的目标商品交易数据时,对目标商品交易数据进行多维度分析,得到商品交易分析报告。
在一个实施例中,如图10所示,提供了一种数据存储装置1000,该装置可以采用软件模块或硬件模块,或者是二者的结合成为计算机设备的一部分,该装置具体包括:数据写入模块1002、片段写入模块1004和片段调整模块1006,其中:
数据写入模块1002,用于获取待写入的数据对象,并确定与数据对象相对应的目标共享空间;目标共享空间包括内容存储区域和片段存储区域;将数据对象写入目标共享空间中的内容存储区域。
片段写入模块1004,用于生成与数据对象相对应的原始片段,并将原始片段写入共享内存空间的片段存储区域。
片段调整模块1006,用于根据目标共享空间的第二首地址、以及数据对象中的初始存储对象在目标共享空间中的初始存储地址,确定初始存储对象在目标共享空间中的第二偏移位置信息;根据第二偏移位置信息,对原始片段中的片段元信息进行调整,得到与数据对象对应的目标片段;其中,目标片段中的片段元信息用于指示数据对象中的初始存储对象在目标共享空间中的存储位置。
在一个实施例中,数据写入模块1002还用于确定数据对象中的每个存储对象分别引用的引用对象;将存储对象和引用对象,写入内容存储区域。
在一个实施例中,片段写入模块1004还用于生成与数据对象相对应的原始片段;确定片段存储区域中已存储的、且位于最后顺序的片段在目标共享空间中的已占用位置信息;根据已占用位置信息,确定片段存储区域中的目标未占用位置,并将原始片段写入目标未占用位置处。
在一个实施例中,目标共享空间包括文件元信息存储区域;数据存储装置1000还用于当数据对象被写入至目标共享空间中的内容存储区域中时,读取存储于文件元信息存储区域中的片段总数量和数据总量;分别对片段总数量和数据总量进行数值的增加。
在一个实施例中,数据存储装置1000还用于当目标共享空间符合映射条件时,根据预设的文件存储路径,将存储于目标共享空间中的数据对象映射至磁盘,得到存储于磁盘中的共享内存文件。
关于数据访问装置、数据存储装置的具体限定可以参见上文中对于数据访问方法和数据存储方法的限定,在此不再赘述。上述数据访问装置、数据存储装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各模块对应的操作。
在一个实施例中,提供了一种计算机设备,该计算机设备可以是服务器,其内部结构图可以如图11所示。该计算机设备包括通过系统总线连接的处理器、存储器和网络接口。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统、计算机程序和数据库。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的数据库用于存储数据访问数据。该计算机设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种数据访问方法。
本领域技术人员可以理解,图11中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
在一个实施例中,还提供了一种计算机设备,包括存储器和处理器,存储器中存储有计算机程序,该处理器执行计算机程序时实现上述各方法实施例中的步骤。
在一个实施例中,提供了一种计算机可读存储介质,存储有计算机程序,该计算机程序被处理器执行时实现上述各方法实施例中的步骤。
在一个实施例中,提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述各方法实施例中的步骤。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和易失性存储器中的至少一种。非易失性存储器可包括只读存储器(Read-Only Memory,ROM)、磁带、软盘、闪存或光存储器等。易失性存储器可包括随机存取存储器(Random Access Memory,RAM)或外部高速缓冲存储器。作为说明而非局限,RAM可以是多种形式,比如静态随机存取存储器(Static Random Access Memory,SRAM)或动态随机存取存储器(Dynamic Random Access Memory,DRAM)等。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。
Claims (15)
1.一种数据访问方法,其特征在于,所述方法包括:
获取与待访问对象对应的、且携带有目标索引信息的数据访问指令,所述待访问对象为写入至目标共享空间中的数据对象的至少一部分,且所述待访问对象中包括有至少一个目标对象;
根据所述目标索引信息,确定加载有共享内存文件的目标地址空间的第一首地址、及所述待访问对象中的初始对象在所述目标共享空间中的初始位置信息;所述共享内存文件是对所述目标共享空间中的各数据对象进行映射得到;
基于所述第一首地址对所述初始位置信息进行调整,得到与所述目标地址空间相匹配的对象位置信息;
根据所述对象位置信息,并通过调用所述目标地址空间,获取与所述初始对象对应的数据内容;
依次对所述待访问对象中除初始对象之外的各个目标对象进行轮询处理,以得到每个目标对象各自所对应的数据内容;其中,对于每次轮询至的当前目标对象,根据前次轮询至的前序目标对象的对象位置信息,确定当次轮询至的当前目标对象的对象位置信息,并根据所述当前目标对象的对象位置信息,通过调用所述目标地址空间,获取与所述当前目标对象对应的数据内容。
2.根据权利要求1所述的方法,其特征在于,所述目标索引信息包括共享内存文件的文件存储路径和目标片段标识;
所述根据所述目标索引信息,确定加载有共享内存文件的目标地址空间的第一首地址、及所述待访问对象中的初始对象在所述目标共享空间中的初始位置信息,包括:
根据所述文件存储路径,确定加载有共享内存文件的目标地址空间的第一首地址,并基于所述第一首地址确定与所述共享内存文件对应的文件元数据;
根据所述文件元数据和所述目标片段标识,确定与所述待访问对象对应的目标片段;
根据所述目标片段的片段内容,确定所述待访问对象中的初始对象在所述目标共享空间中的初始位置信息。
3.根据权利要求2所述的方法,其特征在于,所述文件元数据包括所述共享内存文件中的头部所占用内存的空间大小;所述根据所述文件元数据和所述目标片段标识,确定与所述待访问对象对应的目标片段,包括:
根据所述目标片段标识和所述空间大小,确定与所述待访问对象对应的目标片段在所述目标共享空间中的第一偏移位置信息;
根据所述第一首地址和所述第一偏移位置信息,确定与所述目标片段对应、且与所述目标地址空间相匹配的片段位置信息;
根据所述目标片段的片段位置信息,确定所述目标片段的片段内容。
4.根据权利要求1所述的方法,其特征在于,所述数据访问指令通过数据访问进程触发;所述根据所述对象位置信息,并通过调用所述目标地址空间,获取与所述初始对象对应的数据内容,包括:
响应于所述数据访问指令,根据与所述初始对象对应的对象位置信息,并通过所述数据访问进程调用所述目标地址空间,从与所述目标地址空间相对应的目标物理内存中读取所述初始对象的数据内容并反馈;其中,所述目标物理内存中的数据内容是通过计算机内核从所述共享内存文件中调入并存储至的。
5.根据权利要求1所述的方法,其特征在于,所述对于每次轮询至的当前目标对象,根据前次轮询至的前序目标对象的对象位置信息,确定当次轮询至的当前目标对象的对象位置信息,包括:
确定前次轮询至的前序目标对象的对象位置信息和所述前序目标对象所占用内存的空间大小;
基于所述前序目标对象的对象位置信息和所述前序目标对象所占用内存的空间大小,确定当次轮询至的当前目标对象的对象位置信息。
6.根据权利要求1所述的方法,其特征在于,所述根据所述当前目标对象的对象位置信息,通过调用所述目标地址空间,获取与所述当前目标对象对应的数据内容,包括:
根据所述当前目标对象的对象位置信息,通过调用所述目标地址空间,获取所述当前目标对象中的数据内容;
当所述当前目标对象中的数据内容表征所述当前目标对象引用了至少一层的引用对象时,基于各层引用对象各自所对应的引用位置信息,确定各层引用对象各自所包括的数据内容;
将所述当前目标对象中的数据内容和各层引用对象各自所包括的数据内容,共同作为与所述当前目标对象对应的数据内容。
7.根据权利要求6所述的方法,其特征在于,所述当所述当前目标对象中的数据内容表征所述当前目标对象引用了至少一层的引用对象时,基于各层引用对象各自所对应的引用位置信息,确定各层引用对象各自所包括的数据内容,包括:
当所述当前目标对象中的数据内容包括所述当前目标对象在当前层级所引用的引用对象的引用位置信息时,基于所述第一首地址、以及所述目标共享空间的第二首地址中的至少一种,对当前层级的引用对象的引用位置信息进行调整,得到当前层级的引用对象所对应的、且与所述目标地址空间相匹配的对象位置信息;
根据当前层级的引用对象的对象位置信息,并通过调用所述目标地址空间,获取与所述当前层级的引用对象对应的数据内容;
当所述当前层级的引用对象中的数据内容包括下一层级的引用对象在所述目标共享空间中的引用位置信息时,将所述下一层级的引用对象作为下一轮的当前层级的引用对象,返回所述基于所述第一首地址、以及所述目标共享空间的第二首地址中的至少一种,对当前层级的引用对象的引用位置信息进行调整,得到当前层级的引用对象所对应的、且与所述目标地址空间相匹配的对象位置信息的步骤继续执行,直至得到最终层级的引用对象的数据内容为止。
8.根据权利要求1至7中任一项所述的方法,其特征在于,所述待访问对象为OLAP引擎组件通过大数据平台采集的商品交易数据;所述方法还包括:
当获取得到与所述待访问对象对应的目标商品交易数据时,对所述目标商品交易数据进行多维度分析,得到商品交易分析报告。
9.一种数据存储方法,其特征在于,所述方法包括:
获取待写入的数据对象,并确定与所述数据对象相对应的目标共享空间;所述目标共享空间包括内容存储区域和片段存储区域;
将所述数据对象写入所述目标共享空间中的内容存储区域;
生成与所述数据对象相对应的原始片段,并将所述原始片段写入所述共享内存空间的片段存储区域;
根据所述目标共享空间的第二首地址、以及所述数据对象中的初始存储对象在所述目标共享空间中的初始存储地址,确定所述初始存储对象在所述目标共享空间中的第二偏移位置信息;
根据所述第二偏移位置信息,对所述原始片段中的片段元信息进行调整,得到与所述数据对象对应的目标片段;其中,所述目标片段中的片段元信息用于指示所述数据对象中的初始存储对象在所述目标共享空间中的存储位置。
10.根据权利要求9所述的方法,其特征在于,所述将所述数据对象写入所述目标共享空间中的内容存储区域,包括:
确定所述数据对象中的每个存储对象分别引用的引用对象;
将所述存储对象和所述引用对象,写入所述内容存储区域。
11.根据权利要求9所述的方法,其特征在于,所述生成与所述数据对象相对应的原始片段,并将所述原始片段写入所述共享内存空间的片段存储区域,包括:
生成与所述数据对象相对应的原始片段;
确定所述片段存储区域中已存储的、且位于最后顺序的片段在所述目标共享空间中的已占用位置信息;
根据所述已占用位置信息,确定所述片段存储区域中的目标未占用位置,并将所述原始片段写入所述目标未占用位置处。
12.根据权利要求9至11中任一项所述的方法,其特征在于,所述目标共享空间包括文件元信息存储区域;所述方法还包括:
当所述数据对象被写入至所述目标共享空间中的内容存储区域中时,读取存储于所述文件元信息存储区域中的片段总数量和数据总量;
分别对所述片段总数量和所述数据总量进行数值的增加。
13.一种数据访问装置,其特征在于,所述装置包括:
初始位置确定模块,用于获取与待访问对象对应的、且携带有目标索引信息的数据访问指令,所述待访问对象为写入至目标共享空间中的数据对象的至少一部分,且所述待访问对象中包括有至少一个目标对象;根据所述目标索引信息,确定加载有共享内存文件的目标地址空间的第一首地址、及所述待访问对象中的初始对象在所述目标共享空间中的初始位置信息;所述共享内存文件是对所述目标共享空间中的各数据对象进行映射得到;
初始对象获取模块,用于基于所述第一首地址对所述初始位置信息进行调整,得到与所述目标地址空间相匹配的对象位置信息;根据所述对象位置信息,并通过调用所述目标地址空间,获取与所述初始对象对应的数据内容;
目标对象获取模块,用于依次对所述待访问对象中除初始对象之外的各个目标对象进行轮询处理,以得到每个目标对象各自所对应的数据内容;其中,对于每次轮询至的当前目标对象,根据前次轮询至的前序目标对象的对象位置信息,确定当次轮询至的当前目标对象的对象位置信息,并根据所述当前目标对象的对象位置信息,通过调用所述目标地址空间,获取与所述当前目标对象对应的数据内容。
14.一种数据读取装置,其特征在于,所述装置包括:
数据写入模块,用于获取待写入的数据对象,并确定与所述数据对象相对应的目标共享空间;所述目标共享空间包括内容存储区域和片段存储区域;将所述数据对象写入所述目标共享空间中的内容存储区域;
片段写入模块,用于生成与所述数据对象相对应的原始片段,并将所述原始片段写入所述共享内存空间的片段存储区域;
片段调整模块,用于根据所述目标共享空间的第二首地址、以及所述数据对象中的初始存储对象在所述目标共享空间中的初始存储地址,确定所述初始存储对象在所述目标共享空间中的第二偏移位置信息;根据所述第二偏移位置信息,对所述原始片段中的片段元信息进行调整,得到与所述数据对象对应的目标片段;其中,所述目标片段中的片段元信息用于指示所述数据对象中的初始存储对象在所述目标共享空间中的存储位置。
15.一种计算机可读存储介质,存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至12中任一项所述的方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110052330.5A CN114764426A (zh) | 2021-01-15 | 2021-01-15 | 数据访问方法和装置、数据存储方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110052330.5A CN114764426A (zh) | 2021-01-15 | 2021-01-15 | 数据访问方法和装置、数据存储方法和装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114764426A true CN114764426A (zh) | 2022-07-19 |
Family
ID=82363344
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110052330.5A Pending CN114764426A (zh) | 2021-01-15 | 2021-01-15 | 数据访问方法和装置、数据存储方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114764426A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116560878A (zh) * | 2023-07-07 | 2023-08-08 | 腾讯科技(深圳)有限公司 | 一种内存共享方法和相关装置 |
CN116662038A (zh) * | 2023-07-25 | 2023-08-29 | 菲特(天津)检测技术有限公司 | 基于共享内存的工业信息检测方法、装置、设备及介质 |
-
2021
- 2021-01-15 CN CN202110052330.5A patent/CN114764426A/zh active Pending
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116560878A (zh) * | 2023-07-07 | 2023-08-08 | 腾讯科技(深圳)有限公司 | 一种内存共享方法和相关装置 |
CN116560878B (zh) * | 2023-07-07 | 2024-03-22 | 腾讯科技(深圳)有限公司 | 一种内存共享方法和相关装置 |
CN116662038A (zh) * | 2023-07-25 | 2023-08-29 | 菲特(天津)检测技术有限公司 | 基于共享内存的工业信息检测方法、装置、设备及介质 |
CN116662038B (zh) * | 2023-07-25 | 2023-10-27 | 菲特(天津)检测技术有限公司 | 基于共享内存的工业信息检测方法、装置、设备及介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11403321B2 (en) | System and method for improved performance in a multidimensional database environment | |
US9836244B2 (en) | System and method for resource sharing across multi-cloud arrays | |
US11176102B2 (en) | Incremental virtual machine metadata extraction | |
US10565125B2 (en) | Virtual block addresses | |
US20070005669A1 (en) | Method and system for automated disk i/o optimization of restored databases | |
CN110399333B (zh) | 删除快照的方法、设备和计算机程序产品 | |
CN111177302A (zh) | 业务单据处理方法、装置、计算机设备和存储介质 | |
CN114764426A (zh) | 数据访问方法和装置、数据存储方法和装置 | |
CN110781214A (zh) | 数据库读写方法、装置、计算机设备和存储介质 | |
CN110968554A (zh) | 一种基于文件链分块的区块链存储方法、存储系统及存储介质 | |
WO2021129151A1 (zh) | 文件备份方法、装置及终端设备 | |
CN114138549A (zh) | 基于kubernetes系统的数据备份和恢复方法 | |
US11822806B2 (en) | Using a secondary storage system to implement a hierarchical storage management plan | |
CN115470156A (zh) | 基于rdma的内存使用方法、系统、电子设备和存储介质 | |
CN110569000A (zh) | 基于固态硬盘阵列的主机端raid管理方法和装置 | |
KR20180022538A (ko) | 저장 장치를 사전 조정하는 방법 및 시스템 | |
WO2023071043A1 (zh) | 文件聚合兼容方法、装置、计算机设备和存储介质 | |
US11593399B2 (en) | System and method for managing B tree node sharing using operation sequence numbers | |
CN114416530A (zh) | 字节码修改方法、装置、计算机设备和存储介质 | |
US20180150405A1 (en) | Data type management | |
US11977457B2 (en) | Backup and recovery under group-level encryption | |
CN112988787B (zh) | 数据库数据处理方法、装置、计算机设备和存储介质 | |
US11899811B2 (en) | Processing data pages under group-level encryption | |
WO2023093761A1 (zh) | 处理数据的方法和相关装置 | |
US11379321B2 (en) | Computer system, control method, and recording medium |
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 |