CN116560562A - 一种读、写数据方法及装置 - Google Patents

一种读、写数据方法及装置 Download PDF

Info

Publication number
CN116560562A
CN116560562A CN202210114822.7A CN202210114822A CN116560562A CN 116560562 A CN116560562 A CN 116560562A CN 202210114822 A CN202210114822 A CN 202210114822A CN 116560562 A CN116560562 A CN 116560562A
Authority
CN
China
Prior art keywords
memory
memory unit
data
sub
pair
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
Application number
CN202210114822.7A
Other languages
English (en)
Inventor
王俊
张真波
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Huawei Technologies Co Ltd
Original Assignee
Huawei Technologies Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Huawei Technologies Co Ltd filed Critical Huawei Technologies Co Ltd
Priority to CN202210114822.7A priority Critical patent/CN116560562A/zh
Publication of CN116560562A publication Critical patent/CN116560562A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0602Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
    • G06F3/061Improving I/O performance
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0628Interfaces specially adapted for storage systems making use of a particular technique
    • G06F3/0629Configuration or reconfiguration of storage systems
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0668Interfaces specially adapted for storage systems adopting a particular infrastructure
    • G06F3/0671In-line storage system

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Human Computer Interaction (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

一种读、写数据方法及装置。在写数据方法中,服务器获取待写入内存的KV对,该内存包括连续的多个内存单元;若所述待写入的KV对对应的内存单元已满,则更新所述内存单元,更新后所述内存单元存储有所述内存单元的子内存单元的信息,所述子内存单元用于存储K值在所述内存单元对应的K值范围的KV对。通过上述设计,服务器可以在保证原始KV序列的定位准确性的基础上,及时写入待写入的KV对,即使插入该KV对后初始KV序列改变,仍不会影响客户端侧的单边读,并且内存单元对应一段K值范围,且内存单元连续,因此,能够同时支持点查和范围查,提高系统读性能,降低业务时延。

Description

一种读、写数据方法及装置
技术领域
本申请涉及计算机技术领域,尤其涉及一种读、写数据方法及装置。
背景技术
在一种存储场景中,客户端可以将用户数据以键值(key-value,KV)对的形式存储于存储设备中。对应的,存储设备为客户端提供数据(如KV对)的增加、删除、更新、查询等服务。
在一种相关技术中,存储设备在执行KV对的增加操作时,可以将从客户端获取的KV对,按照该KV对的K值进行哈希运算,以得到一个哈希值,从而将该KV对存储至该哈希值对应的内存空间中。
然而,由于存储设备将KV对按照哈希值进行打散存储,因此这种方式不利于进行KV对的范围查询。
发明内容
本申请提供一种读、写数据方法及装置,能够支持点查及范围查询,提高读性能、减少存储设备的计算资源开销。
第一方面,本申请实施例提供了一种写数据方法,该方法可以由服务端设备(如服务器)执行,以服务器为例,在方法中,服务器获取待写入内存的KV对,如接收客户端发送的写数据请求,写数据请求中包括待写入的KV对,又如,服务器从本地缓存中获取待写入的KV对,其中,服务器的内存包括用于存储KV对的连续多个内存单元;若该待写入的KV对对应的内存单元已满,则更新该内存单元,更新后该内存单元存储有该内存单元的子内存单元的信息,该子内存单元用于存储K值在所述内存单元对应的K值范围的KV对,所述待写入的KV对存储于更新后的所述内存单元或所述内存单元的子内存单元。
通过上述设计,服务器获取待写入的KV对,如果待写入的KV对对应的内存单元已满,则服务器更新该内存单元,更新后,内存单元包括子内存单元的信息。该待写入的KV对可以存储至内存单元或该内存单元的子内存单元。这样,服务器可以在保证原始KV序列的定位准确性的基础上,及时写入目标KV对,即使插入目标KV对后初始KV序列改变,仍不会影响客户端侧的单边读,因此,服务端201和客户端之间不需要频繁交互变化后KV对的位置等相关信息,节省网络带宽和网络传输资源,以及降低了服务器的计算开销。并且,能够同时支持点查和范围查,并且无论点查还是范围查,客户端都能够全程通过单边读的方式完成,进一步节省服务器侧的计算开销,同时降低了业务时延。
在一种可能的实现方式中,所述子内存单元的信息包括所述子内存单元的地址信息;或所述子内存单元的信息包括所述子内存单元的地址信息和所述第一指示信息,所述第一指示信息用于指示所述子内存单元存储的KV对的K值范围。
通过上述设计,内存单元中包括子内存单元的地址信息,客户端读取内存单元的数据,从而获得子内存单元的地址信息,客户端通过单边读的方式获取该子内存单元的数据。内存单元还包括子内存单元的K值范围时,更加有利于客户端的查询操作,客户端根据K值范围确定可能存储待查询KV对的子内存单元,从而加速查询效率。
在一种可能的实现方式中,所述更新所述内存单元后,所述第一KV对序列存储于所述内存单元和所述子内存单元中,或所述第一KV对序列存储于所述子内存单元中;其中,所述第一KV对序列包括所述内存单元在被更新之前已存储的KV对和所述待写入的KV对,所述第一KV对序列内的KV对按照K值大小顺序排列。
通过上述设计,内存单元存储第一KV对的部分KV对,可以提高内存利用率。内存单元不存储KV对时,客户端可以直接确定内存单元中的信息为子块的信息,简化查询流程。
在一种可能的实现方式中,更新后所述内存单元还存储有第二指示信息,所述第二指示信息用于指示所述内存单元具有子内存单元。
通过上述设计,通过第二指示信息区分内存单元是否具有子内存单元,有利于简化客户端的查询操作,同时在训练模块时,对于部分不具有子内存单元的的内存单元可以不重新训练。
在一种可能的实现方式中,所述连续的多个内存单元中所存储的KV对按照K值大小顺序排列;所述KV对对应的内存单元为K值范围包括所述待写入KV对的K值的内存单元。
通过上述设计,KV对按照K值大小顺序排列,有助于进行范围查询。
在一种可能的实现方式中,通过下列方式确定所述待写入的KV对对应的内存单元:
将所述待写入的KV对的K值输入至已训练的模型,得到所述待写入的KV对在所述连续的多个内存单元中的插入位置;根据所述模型的误差范围和所述插入位置,确定所述待写入的KV对在所述多个内存单元中的插入位置范围;其中,所述模型是基于所述多个内存单元中所存储的KV对的K值和所述KV对在所述多个内存单元中的存储位置训练后得到的;所述待写入的KV对对应的内存单元为,所述插入位置范围所在的一个内存单元或多个内存单元中,K值范围包括所述待写入KV对的K值的内存单元。
通过上述设计,由于可以控制模型的误差范围来提高定位精度,使用模型来确定KV对在内存的位置更加准确,且模型比较小,避免占用过多内存。
在一种可能的实现方式中,所述方法还包括:当达到预设重构条件时,将所述连续的多个内存单元中每个内存单元的子内存单元中所存储的KV对与所述多个内存单元中存储的KV对合并,得到第二KV对序列,所述第二KV序列中的KV对按照K值大小顺序排列,所述第二KV对序列存储于所述内存中;使用所述第二KV对序列重新训练所述模型。
通过上述设计,当达到重构条件时,将子内存单元和内存单元的数据合并,可以简化内存中的数据结构,降低客户端通过二次单边读的概率。
在一种可能的实现方式中,所述预设重构条件包括:训练时间间隔达到预设时长,或者在训练时间间隔内,插入的KV对的数量达到预设阈值。
通过上述设计,通过控制重构条件,可以减少子内存单元的数量,从而控制客户端通过二次单边读的概率。
第二方面,本申请实施例提供了一种读数据方法,该方法可以由客户端设备(简称客户端)执行,在方法中,客户端预测服务器的内存中可能存储有待读取KV对的内存区域,该内存区域包括一个或多个连续的内存单元(记为目标内存单元);若客户端缓存有其中一个目标内存单元的数据(记为第一数据),则根据第一数据,向服务器发送第一读请求;其中,第一数据包括该内存单元的子内存单元(记为第一子内存单元)的第一地址信息;所述第一读请求用于请求读取第一子内存单元中的数据;客户端接收服务器发送的该第一子内存单元存储的数据。
通过上述设计,如果客户端缓存有目标内存单元的第一数据,第一数据记录有第一子内存单元的地址信息,则可以通过单边读来获取第一子内存单元的数据,不需要通过双边读的方式即可以完成查询操作,可以节省服务端的计算开销,提高读性能。
在一种可能的实现方式中,所述第一数据还包括所述子内存单元对应的K值范围,所述K值范围包括所述待读取KV对的K值。
通过上述设计,内存单元还包括子内存单元的K值范围时,更加有利于客户端的查询操作,客户端根据K值范围确定可能存储待查询KV对的子内存单元,从而加速查询效率。
在一种可能的实现方式中,所述客户端向服务器发送第一读请求的同时,还包括:
所述客户端向所述服务器发送第二读请求,所述第二读请求用于请求读取所述内存区域中的数据;所述客户端接收所述服务器发送的所述数据,所述数据包括所述内存单元存储的第二数据;其中,若所述第一数据与所述第二数据相同,所述客户端在所述子内存单元的数据中查找所述待读取KV对;或若所述第一数据与所述第二数据不同,所述客户端根据所述第二数据中记录的子内存单元的第二地址信息,向所述服务器发送第三读请求,所述第三读请求用于请求读取所述第二地址信息指示的所述子内存单元的数据;所述客户端接收所述服务器发送的所述子内存单元的数据,并在所述数据中查找所述待读取KV对。
通过上述设计,如果客户端缓存有目标内存单元的数据,则可以通过两个并行的单边读来获取目标内存单元的数据以及目标子块的数据。若新读回来的目标内存单元的数据与缓存的该目标内存单元的数据相比,目标子块的地址未发生变化,则说明读回的子块的数据是有效的,可以在该子块的数据中查询目标KV对。如果目标子块的地址发生变化,则说明按照缓存的数据读回的子块的数据是无效的,客户端重新通过(串行的)两次单边读来读取该变化后的目标子块的数据,并在该目标子块的数据查找目标KV对。本申请实施例提供的读数据方法,能够同时支持点查和范围查询,并且无论点查还是范围查询,均可以通过一次并行的单边读,或两次单边读来完成,不需要通过双边读的方式即可以完成查询操作,可以节省服务端的计算开销,提高读性能。
在一种可能的实现方式中,所述客户端预测服务器内存中存储有待读取键值KV对的内存区域,包括:将所述待读取KV对的K值输入已训练的模型,得到所述KV对在所述服务器内存中的存储位置,所述内存包括连续的多个内存单元;根据所述模型的误差范围和所述存储位置,确定所述KV对在所述多个内存单元中的存储位置范围;其中,所述内存区域包括所述存储位置范围所在的一个或多个内存单元;或所述内存区域包括所述一个或多个内存单元中,K值范围包括所述待写入KV对的K值的内存单元;所述模型是基于所述多个内存单元中所存储的KV对的K值和所述KV对在所述多个内存单元中的存储位置训练后得到的。
通过上述设计,由于可以控制模型的误差范围来提高定位精度,使用模型来确定KV对在内存的位置更加准确,且模型比较小,不会占用过多内存
在一种可能的实现方式中,所述客户端预测服务器内存中存储有待读取键值KV对的内存单元之前,还包括:所述客户端接收所述服务器发送的所述已训练的模型和所述模型的误差范围。
通过上述设计,服务端可以将已训练的模型发送给客户端,供客户端执行查询操作,由于模型相对较小,且本申请中不需要频率训练模型,可以降低网络带宽和网络资源开销。
在一种可能的实现方式中,所述方法还包括:若所述客户端未缓存所述内存区域的数据,则所述客户端向所述服务端发送第二读请求,所述第二读请求用于请求读取所述内存区域的数据;接收所述服务端发送的所述内存区域的数据,所述数据包括所述内存区域所包括的一个或多个内存单元的数据;其中,若所述一个或多个内存单元中的其中一个内存单元包括子内存单元,则根据所述内存单元的数据,向所述服务端发送第三读请求,所述第三读请求用于请求读取所述子内存单元的数据;所述内存单元的数据包括所述子内存单元的地址信息;接收所述服务端发送的所述子内存单元的数据。
通过上述设计,如果未缓存该目标内存单元的数据,则首先通过一个单边读将该目标查询区域的数据读取上来,如果该目标查询区域不具有子内存单元,则可以直接在该目标内存单元的数据中查找目标KV对。如果该目标内存单元为具有子内存单元,则客户端可以再发起一个单边读将目标内存单元的子内存单元的数据读上来,并在子内存单元的数据中继续查找目标KV对。在本申请中,可以通过一次单边读或两次单边读来完成,无论是否命中目标KV对,均结束查询操作,不需要通过双边读的方式确定服务端是否存储有目标KV对,提供了完全单边读的查询方式,可以节省服务端的计算开销,提高读性能。
第三方面,本申请实施例还提供了一种计算装置,该计算装置具有实现上述第一方面的方法实例中服务器的功能,有益效果可以参见第一方面的描述此处不再赘述,有益效果可以参见第二方面的描述此处不再赘述。所述功能可以通过硬件实现,也可以通过硬件执行相应的软件实现。所述硬件或软件包括一个或多个与上述功能相对应的模块。在一个可能的设计中,所述计算装置的结构中包括获取模块、更新模块;可选的,还可以包括处理模块;
获取模块,用于获取待写入内存的键值KV对;所述内存包括连续的多个内存单元;
更新模块,用于在当所述待写入的KV对对应的内存单元已满时,更新所述内存单元;更新后所述内存单元存储有所述内存单元的子内存单元的信息,所述子内存单元用于存储K值在所述内存单元对应的K值范围的KV对。
在一种可能的实现方式中,所述子内存单元的信息包括所述子内存单元的地址信息;或所述子内存单元的信息包括所述子内存单元的地址信息和所述第一指示信息。
在一种可能的实现方式中,在所述更新模块更新所述内存单元之后,所述第一KV对序列存储于所述内存单元和所述子内存单元中,或所述第一KV对序列存储于所述子内存单元中;其中,所述第一KV对序列包括所述内存单元在被更新之前已存储的KV对和所述待写入的KV对,所述第一KV对序列内的KV对按照K值大小顺序排列。
在一种可能的实现方式中,在所述更新模块更新所述内存单元之后,所述内存单元还存储有第二指示信息,所述第二指示信息用于指示所述内存单元具有子内存单元。
在一种可能的实现方式中,所述连续的多个内存单元中所存储的KV对按照K值大小顺序排列;所述KV对对应的内存单元为K值范围包括所述待写入KV对的K值的内存单元。
在一种可能的实现方式中,所述处理模块,用于通过下列方式确定所述待写入的KV对对应的内存单元:将所述待写入的KV对的K值输入至已训练的模型,得到所述待写入的KV对在所述连续的多个内存单元中的插入位置;根据所述模型的误差范围和所述插入位置,确定所述待写入的KV对在所述多个内存单元中的插入位置范围;
其中,所述模型是基于所述多个内存单元中所存储的KV对的K值和所述KV对在所述多个内存单元中的存储位置训练后得到的;所述待写入的KV对对应的内存单元为,所述插入位置范围所在的一个内存单元或多个内存单元中,K值范围包括所述待写入KV对的K值的内存单元。
在一种可能的实现方式中,所述处理模块,还用于当达到预设重构条件时,将所述连续的多个内存单元中每个内存单元的子内存单元中所存储的KV对与所述多个内存单元中存储的KV对合并,得到第二KV对序列,所述第二KV序列中的KV对按照K值大小顺序排列,所述第二KV对序列存储于所述内存中;使用所述第二KV对序列重新训练所述模型。
在一种可能的实现方式中,所述预设重构条件包括:训练时间间隔达到预设时长,或者在训练时间间隔内,插入的KV对的数量达到预设阈值。
第四方面,本申请实施例还提供了一种计算装置,该计算装置具有实现上述第二方面的方法实例中客户端的功能,有益效果可以参见第二方面的描述此处不再赘述。所述功能可以通过硬件实现,也可以通过硬件执行相应的软件实现。所述硬件或软件包括一个或多个与上述功能相对应的模块。在一个可能的设计中,所述计算装置的结构中包括预测模块、处理模块、通信模块;
预测模块,用于预测服务器内存中存储有待读取键值KV对的内存区域,所述内存区域包括一个或多个连续的内存单元;
处理模块,用于根据缓存的其中一个内存单元的第一数据,控制通信模块向所述服务器发送第一读请求;其中,所述第一数据包括所述内存单元的子内存单元的第一地址信息;所述第一读请求用于请求读取所述第一地址信息指示的子内存单元中的数据;
所述通信模块,还用于接收所述服务器发送的所述子内存单元存储的数据。
在一种可能的实现方式中,所述第一数据还包括所述子内存单元对应的K值范围,所述K值范围包括所述待读取KV对的K值。
在一种可能的实现方式中,所述通信模块向所述服务器发送第一读请求的同时,还用于:向所述服务器发送第二读请求,所述第二读请求用于请求读取所述内存区域中的数据;接收所述服务器发送的所述数据,所述数据包括所述内存单元存储的第二数据;
若所述第一数据与所述第二数据不同,所述处理模块还用:根据所述第二数据中记录的子内存单元的第二地址信息,控制所述通信模块向所述服务器发送第三读请求,所述第三读请求用于请求读取所述第二地址信息指示的所述子内存单元的数据;所述通信模块还用于:接收所述服务器发送的所述子内存单元的数据。
在一种可能的实现方式中,所述预测模块在预测服务器内存中存储有待读取键值KV对的内存区域时,具体用于:将所述待读取KV对的K值输入已训练的模型,得到所述KV对在所述服务器内存中的存储位置,所述内存包括连续的多个内存单元;根据所述模型的误差范围和所述存储位置,确定所述KV对在所述多个内存单元中的存储位置范围;其中,所述内存区域包括所述存储位置范围所在的一个或多个内存单元;或所述内存区域包括所述一个或多个内存单元中,K值范围包括所述待写入KV对的K值的内存单元;所述模型是基于所述多个内存单元中所存储的KV对的K值和所述KV对在所述多个内存单元中的存储位置训练后得到的。
在一种可能的实现方式中,所述在所述预测模块预测服务器内存中存储有待读取键值KV对的内存单元之前,所述通信模块还用于:接收所述服务器发送的所述已训练的模型和所述模型的误差范围。
在一种可能的实现方式中,所述通信模块还用于:在所述客户端未缓存所述内存区域的数据时,向所述服务端发送第二读请求,所述第二读请求用于请求读取所述内存区域的数据;接收所述服务端发送的所述内存区域的数据,所述数据包括所述内存区域所包括的一个或多个内存单元的数据;
若所述一个或多个内存单元中的其中一个内存单元包括子内存单元,则所述处理模块还用于:根据所述内存单元的数据,控制所述通信模块向所述服务端发送第三读请求,所述第三读请求用于请求读取所述子内存单元的数据;所述内存单元的数据包括所述子内存单元的地址信息;所述通信模块还用于:接收所述服务端发送的所述子内存单元的数据。
第五方面,本申请还提供了一种计算装置,所述计算装置包括处理器和存储器,还可以包括通信接口,所述处理器执行所述存储器中的程序指令执行上述第一方面或第一方面任一可能的实现方式提供的方法;或执行所述存储器中的程序指令执行上述第二方面或第二方面任一可能的实现方式提供的方法。所述存储器与所述处理器耦合,其保存有执行数据备份过程中必要的程序指令和数据。所述通信接口,用于与其他设备进行通信,如接收待执行的任务。
第六方面,本申请提供了一种计算机可读存储介质,所述计算机可读存储介质被计算装置执行时,所述计算装置执行前述第一方面或第一方面的任意可能的实现方式中提供的方法;或执行前述第二方面或第二方面的任意可能的实现方式中提供的方法。该存储介质中存储了程序。该存储介质包括但不限于易失性存储器,例如随机访问存储器,非易失性存储器,例如快闪存储器、硬盘(hard disk drive,HDD)、固态硬盘(solid state drive,SSD)。
第七方面,本申请提供了一种计算装置程序产品,所述计算装置程序产品包括计算机指令,在被计算装置执行时,所述计算装置执行前述第一方面或第一方面的任意可能的实现方式中提供的方法;所述计算装置执行前述第二方面或第二方面的任意可能的实现方式中提供的方法。该计算机程序产品可以为一个软件安装包,在需要使用前述第一方面或第一方面的任意可能的实现方式中提供的方法的情况下,可以下载该计算机程序产品并在计算装置上执行该计算机程序产品。
第八方面,本申请还提供一种计算机芯片,所述芯片与存储器相连,所述芯片用于读取并执行所述存储器中存储的软件程序,执行上述第一方面以及第一方面的各个可能的实现方式中所述的方法;或执行上述第二方面以及第二方面的各个可能的实现方式中所述的方法。
第九方面,本申请实施例还提供了一种系统,该系统包括客户端和服务器,所述客户端和服务器执行前述的第一方面或第一方面的任意可能的实现方式中客户端、服务器执行的方法;或所述客户端和服务器执行前述的第二方面或第二方面的任意可能的实现方式中客户端、服务器执行的方法。
上述第三方面至第九方面中任一实现方式的有益效果请参见第一方面或第二方面的描述,此处不再赘述。
附图说明
图1为本申请实施例提供的一种可能的系统架构示意图;
图2为本申请实施例提供的一种服务端201的结构示意图;
图3为本申请实施例提供的一种写数据方法所对应的流程示意图;
图4为本申请实施例提供的模型对应的曲线示意图;
图5为本申请实施例提供的一种内存数据结构示意图;
图6为本申请实施例提供的一种根块的数据结构示意图;
图7为本申请实施例提供的写入目标KV对前后的对比示意图;
图8为本申请实施例提供的另一种插入目标KV对前后的对比示意图;
图9为本申请实施例提供的一种读数据方法所对应的流程示意图;
图10为本申请实施例提供的一种确定点查的目标查询区域的示意图;
图11为本申请实施例提供的一种确定范围查询的目标查询区域的示意图;
图12为本申请实施例提供的一种计算装置的结构示意图;
图13为本申请实施例提供的另一种计算装置的结构示意图。
具体实施方式
在对本申请所提供的数据处理方法进行说明之前,先对本申请涉及的概念进行说明:
1、远程直接内存访问(remote direct memory access,RDMA)。
RDMA是一种绕过远程设备(如服务端201)操作系统内核访问其内存中数据的技术,由于不经过操作系统,不仅节省了大量处理器资源,同样也提高了系统吞吐量、降低了系统的网络通信延迟,尤其适合在大规模并行计算机集群中有广泛应用。
RDMA有几大特点,(1)数据通过网络与远程设备间进行数据传输;(2)没有操作系统内核的参与,有关发送传输的所有内容都卸载到网卡上;(3)在用户空间虚拟内存与网卡之间直接进行数据传输不涉及操作系统内核,没有额外的数据移动和复制。
2、单边RDMA和双边RDMA。
在这里将需要交互信息的两端分别称为客户端设备(简称客户端)和服务端设备(简称服务端)。客户端部署在用户侧,用户可以通过客户端向服务端发起请求。服务端可以部署在远端。
单边RDMA可以分为RDMA读(READ)以及RDMA写(WRITE)。
以单边RDMA中的RDMA READ为例,客户端可以直接确定目标数据在服务端的内存中的位置,因此客户端发起的用于请求读取数据的报文中携带目标数据的位置信息,将该报文发送给服务端。在服务端侧,服务端侧的网卡读取该位置信息上的数据。上述过程中,服务端侧的处理器对客户端的一系列操作不感知。换句话说,服务端侧的处理器不知道客户端执行了读操作,因而减少了处理器参与数据传输过程的消耗,提升了系统处理业务的性能,具有高带宽、低时延及低CPU占用率的特点。本申请提供了一种,客户端100能够通过RDMA技术读取服务端201中的数据的方式。以单边RDMA中的RDMA READ为例,客户端100预测目标数据(如待读取的KV对)在内存213的位置,客户端100发送的读数据请求(RDMA READ)中携带该目标数据的位置信息。服务端201的网卡214读取内存213中该位置信息上的数据,并将该数据发送给客户端100。上述过程中,服务端201的处理器212对客户端100的一系列操作不感知。换句话说,处理器212不知道客户端100执行了读操作,因而减少了处理器212参与数据传输过程的开销,提升了系统处理业务的性能,具有高带宽、低时延及低CPU占用率的特点。
双边RDMA可以分为RDMA发送(SEND)以及RDMA接收(RECEIVE)。
以双边RDMA中的RDMA RECEIVE为例,客户端并不知道目标数据存储在服务端的内存中的位置,因此客户端发起的用于请求读取数据的报文中不携带目标数据的位置信息。服务端接收到该报文后,服务端侧的处理器查询该目标数据,并将查询到的目标数据返回给客户端。在该过程中,需要服务端侧的处理器参与,也就是说,双边RDMA需要服务端侧的处理器处理来自客户端的报文,所以单边RDMA相对于双边RDMA,读取数据的时间更短,对处理器的占用率更低,用户体验更好。因此,单边RDMA的应用越来越广。
图1是本申请实施例的一种系统架构示意图。如图1所示,该系统包括客户端设备(简称客户端)100和服务端设备(简称服务端)201。
客户端100,部署在用户侧,可以是虚拟机或物理机,物理机可以是桌面电脑、台式计算机、笔记本电脑、服务器等。在软件层面,客户端100上运行有操作系统、应用程序等,在硬件层面,客户端100包括处理器、内存、网卡(图1未示出客户端100的软件结构和硬件结构),这些组件可以参见下文对服务端中相应组件的介绍,此处不再赘述。
用户通过客户端100上运行的应用程序来存取数据,在一种示例中,客户端100将数据存储于服务端201中。具体的,客户端100可以通过网络150与服务端201通信,其中,网络150通常表示任何电信或计算机网络,包含例如企业内部网、广域网(wide areanetwork,WAN)、局域网(local area network,LAN)、个域网(personal area network,PAN)或因特网。或者,客户端100还可以通过光纤交换机(图1未示出)访问服务端201以存取数据。然而,光纤交换机110只是一个可选设备,光纤交换机110也可以替换成以太网交换机、InfiniBand交换机、RoCE(RDMA over Converged Ethernet)交换机等。
服务端201,可以是一台独立的物理服务器、台式计算机、笔记本电脑等,也可以是多个物理服务器构成的服务器集群或者分布式系统中的一个计算节点,可以为客户端100提供服务,如数据存取服务等。
图2为本申请实施例提供的服务端201的硬件结构示意图,参见图2所示,在硬件层面,服务端201至少包括处理器212、内存213、网卡214。其中,处理器212、内存213和网卡214通过总线215连接。
处理器212,可以是一个中央处理器(central processing unit,CPU),用于处理来自客户端100的请求,如写数据请求,处理器212将写数据请求中携带的待写入的KV对写入内存213中,从而为客户端100提供数据存取服务。其中,K(key,键)为V(value,数据)的标识,V表示数据,如用户使用客户端100上的应用程序所产生的数据。在本申请中,处理器212可以将来自客户端100的KV对,按照K值大小顺序写入内存213的一段连续的内存空间中,参见图2所示,该内存213中的KV序列中的KV对按照K值由小到大的顺序排列(也可以说KV对是有序的)。当然,KV对也可以按照K值降序排列,本申请对此不做限定,下文均以KV对升序排列为例进行说明。值得注意的是,用户写入的KV对的K值不一定是连续的,比如,上一个写数据请求中携带的KV对的K值可能是5,下一个写数据请求中携带的KV对的K值可能是96。以K值为5的KV对为例,处理器212将该KV对写入内存213的写操作包括:将K值为7的KV对及其之后的全部KV对整体后移一个KV对的长度(K为5的KV对的长度),将K值为5的KV对插入K值为3的KV对和K值为7的KV对之间,以保持内存213中KV对的有序性。
又如,读数据请求,在一种可选的实施方式中,由处理器212来处理该读数据请求,如处理器212从内存213中获取读数据请求所请求读取的数据,并发送给客户端100。在另一种实施方式中,该读数据请求为RDMA读请求时,该读数据请求可以由网卡214来处理,下文将进行详细介绍,此处不再赘述。
需要说明的是,处理器212还可以是图形处理器(graphics processing unit,GPU)、数据计算单元(data processing unit,DPU)、特殊应用集成电路(applicationspecific integrated circuit,ASIC)、系统级芯片(system on chip,SOC)、可编程门阵列(field programmable gate array,FPGA)、嵌入式神经网络处理器(neural networkprocessing unit,NPU)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件、人工智能芯片、片上芯片等。
内存213,包含多种类型的存储器,例如随机存取存储器(random access memory,RAM)、只读存储器(Read Only Memory,ROM)。随机存取存储器包括但不限于:动态随机存取存储器(Dynamic Random Access Memory,DRAM)、双倍数据速率同步动态随机存储器(double data rate,DDR)、静态随机存取存储器(Static Random Access Memory,SRAM)等。只读存储器包括但不限于:可编程只读存储器(Programmable Read Only Memory,PROM)、可抹除可编程只读存储器(Erasable Programmable Read Only Memory,EPROM)等。实际应用中,服务端201中可配置多个内存213,以及不同类型的内存213。本实施例不对内存213的数量和类型进行限定。
网卡214,用于与存储系统200内部的组件之间通信,如将接收到的来自客户端100的写数据请求发送给处理器212。或用于与外部设备通信,如接收客户端100发送的写数据请求、读数据请求,又如,将客户端100请求读取的数据发送给客户端100。
在硬件层面,网卡214至少包括处理器2141,处理器2141用于处理来自客户端100的RDMA读请求,该RDMA读请求携带内存地址信息,处理器2141读取内存213中该内存地址信息所指示的内存空间中的内存数据(如图2中的KV对),并将该内存数据发送给客户端100。上述过程中,服务端201的处理器212对客户端100的一系列操作不感知。换句话说,处理器212不知道客户端100执行了读操作,因而减少了处理器212参与数据传输过程的开销,提升了系统处理业务的性能,具有高带宽、低时延及低CPU占用率的特点。
总线215,包括但不限于:快捷外围互联标准(peripheral componentinterconnect express,PCIe)、扩展工业标准结构(extended industry standardarchitecture,EISA)总线、统一总线(unified bus,Ubus或UB)、计算机快速链接(computeexpress link,CXL)、缓存一致互联协议(cache coherent interconnect foraccelerators,CCIX)、Z代(generation Z,GENZ)、开源连续加速器处理接口(opencoherent accelerator processor interface,OpenCAPI)、英伟达链接(nvidia link,NVlink)、支持多协议的互联总线。
需要说明的是,图1所示的架构仅为举例,应理解的是,一个服务端201可以为若干客户端100提供服务,为保持简洁,图1仅示出了一个客户端100和一个服务端201,本申请实施例对此不做限定。另外,图2所示的硬件结构仅为举例,在实际应用中,服务端201可以包括比图2更多的组件,如服务端201还可以包括硬盘、键盘、鼠标等。同理,客户端100也可以包括相比前述介绍具有更多的组件,本申请实施例对此不做限定。另外,服务端201还可以为客户端100提供其他服务,如存储服务:服务端201的处理器212可以在内存213中的数据达到预设阈值时,将内存213中的数据迁移至硬盘中进行持久性存储,具体请参见相关技术的说明,此处不做重点说明。本申请实施例对客户端100、服务端201的硬件结构、软件结构等均不做限定。
上文中,客户端100通过RDMA读请求获取服务端201的内存数据的方式也称为单边读,客户端100将读数据请求发送服务端201,由服务端201的处理器212将该读数据请求所请求读取的内存数据发送给客户端100的方式称为双边读。如下以内存数据为KV对为例,进行说明。
本领域技术人员可以确定,实现单边读的前提是,客户端100知道待读取的KV对(目标KV对)在内存213的位置。在一种设计构思中,服务端201将内存213中每个KV对的位置或计算KV对位置的方法通知给客户端100。由于要保持内存213中KV对有序,服务端201每次在内存213中插入新的KV对后,都可能会改变其他KV对的位置,这样,服务端201每次都需要将位置发生改变的KV对的位置或新的计算方法通知给客户端100,而实际应用中,服务端201的写操作是相当频繁的,客户端100与服务端201之间频繁地交互这些信息也会占用大量的网络带宽,并且会消耗服务端201较多的计算资源。
本申请实施例提供了一种数据结构,及基于该数据结构的写数据方法和读数据方法,能够控制客户端100与服务端201交互信息的频率,这里的信息值关于内存213中KV对的位置或计算KV对位置的方法等信息,以降低网络带宽及服务端201的计算开销,同时,能够支持客户端100通过单边读的方式完成KV对的点查和范围查询,并且能够保证查询的准确性。其中,点查是指查询一个KV对,即目标KV对为一个KV对,范围查询是指查询一段K值范围内的KV对,即目标KV对为连续的多个KV对。
接下来结合图1至图3,以本申请实施例应用于图1所示系统为例,对本申请实施例提供的技术方案进行详细介绍。本申请实施例所提供的方法可以由图1中的客户端100和服务端201执行。在本申请实施例中,客户端100能够对服务端201的内存213中的KV对执行增加、删除、更新、查询等操作,其中,增加操作、删除操作、更新操作是属于写操作,均由客户端100发起请求,由服务端201执行并完成的,查询操作是客户端100通过RDMA单边读的方式来完成的。
图3为本申请实施例提供的写数据方法所对应的流程示意图。在图3所示的方法中,将对KV对的插入操作(参见图3中步骤301至步骤307)、删除操作(参见步骤308至步骤310)、更新操作、重构KV序列(步骤311至步骤312)进行介绍,如图3所示,该方法可以包括如下步骤:
步骤301,客户端100向服务端201发送写数据请求,该写数据请求包括但不限于待写入的KV对(记为目标KV对)。
其中,KV对包括K(key,键值)和V(value,数据),其中的K为V的标识,V为数据,如用户使用客户端100上的应用程序所产生的数据,或客户端100运行过程中产生的数据等。
为便于说明,下文中,将K值为n的KV对简称为KV对n,n取正整数,如图2中,将K值为3的KV对简称为KV对3,K值为7的KV对简称为KV对7,依此类推。
需要说明的是,服务端201还可以通过其他方式获取待写入的KV对,如从本地缓存中获取待写入的KV对,本申请对此不做限定。
步骤302,服务端201确定目标KV对在内存213中的插入位置。
这里的插入位置是指,在内存213的KV序列中插入目标KV对后,能够保证内存213中的KV对仍按照K值大小顺序排列(即KV对有序)的位置。
本申请实施例提供一种确定KV对的插入位置的方法,服务端201使用已训练的机器学习模型(简称模型)确定目标KV对在内存213中KV序列的插入位置,该模型是基于内存213中的KV序列来训练的。
如下以图2所示的内存213中的KV序列为例,对该模型的训练过程进行介绍,为便于说明,如下将本次用于训练模型的KV序列称为初始KV序列:
(1)基于内存213中的初始KV序列生成训练样本。
示例性地,以KV对为粒度生成训练样本,即基于该初始KV序列中的一个KV对可以生成一个训练样本。其中一个KV对的训练样本包括:该KV对的K值和用于指示该KV对在内存213中的位置的位置信息。其中,K值为模型的输入数据,位置信息为模型的输出数据。
其中,KV对的位置信息可以是该KV对在内存213的地址,或者,KV对的位置信息为该KV对在该初始KV序列中的排序,如图2中,K值为3的KV对在该KV序列中的排序为1,即第一个;K值为7的KV对在该初始KV序列中的排序为2;K值为11的KV对在该初始KV序列中的排序为3,依此类推。
在一种示例中,本申请中的KV对为定长字段,定长字段是指每个KV对的长度均相同,比如每个KV对的长度均为32B,这样可以结合KV对在该初始KV序列中的排序以及KV对的长度,来计算KV对在内存213中的位置,这种情况下,为了提高定位的准确性,在确定KV对在KV序列中的排序时,还可以将空闲空间考虑进去,比如,假设图2中KV对11之后的空闲空间的长度为32B,相当于排列了一个KV对,则其后的KV对13在该初始KV序列的排序为5。如果该空闲空间的长度为64B,则相当于排列了两个KV对,则KV对13在该初始KV序列的排序为6,依此类推。其中,空闲空间可以是服务端201预留的,也可以是在插入KV对之后又被删除了,也就是说,空闲空间的长度为KV对长度的整数倍,下文会对删除操作进行介绍,此处不再赘述。
需要说明的是,上述KV对的长度为32B仅为举例,本申请对定长字段的长度不做具体限定,比如,还可以均为64B等,任何长度均适用于本申请实施例。
(2)使用训练样本对模型进行训练,以得到满足预设误差范围的模型。
示例性地,该模型可以是分段线性模型,由多个线程组成,每个线段均为一个一次线性函数,可以具有不同的斜率,且覆盖(对应)不同范围的KV对。图4为本申请实施例提供的一个分段线性模型的示意图。其中,图4中的一个圆点表示初始KV序列中的一个KV对,该点的横坐标为该KV对的K值,该点的纵坐标为该KV对在内存213中的实际位置,如排序,而分段线性模型上每个点的纵坐标为模型输出的KV对的预测位置,即预测的排序。
该模型的误差为同一点的预测位置与实际位置的差值的绝对值。如,图2中,KV对13的排序为5,即实际位置为5,若模型输出的该KV对13的预测位置为3或7,则该模型的误差为2,即相差2个位置。其中误差最大值为该模型的误差范围,在训练模型的过程中,通过调整分段的斜率,或调整(如缩小)该分段覆盖的KV对范围,来缩小该分段的误差范围,当每个分段的误差范围均不超过预设误差范围时,该模型训练完成。
该模型训练完成之后便可以使用该模型了,如在步骤302中,服务端201将该目标KV对的K值输入该训练后的模型,得到模型预测的该KV对在该内存213中的插入位置。
需要说明的是,虽然在步骤302介绍了该模型的训练过程,但并非表示每次使用模型前都需要对模型进行重新训练,模型的训练可以在步骤302之前完成,在模型训练完成之后至下一次重新训练模型之前,服务端201和客户端100可以重复多次使用该模型。
值得注意的是,该模型是基于内存213中的原始KV序列训练得到的,也可以理解为,该训练后的模型是用于预测KV对在原始KV序列中的位置的,若原始KV序列发生改变,则该模型的准确性也可能会降低。另外,上述分段线性模型仅为举例,还可以使用其他类型的模型,本申请对此不做限定,任何机器学习模型均适用于本申请实施例。
步骤303,服务端201根据模型确定的插入位置和模型的误差范围确定该目标KV对的插入范围。
举例来说,参见图5,假设模型确定的目标KV对在内存213的插入位置为A点,给定模型的误差范围为L,则该目标KV对的插入范围为[A-L,A+L]。比如,模型预测的目标KV对的排序为102,假设模型的误差范围为5,则该目标KV对的插入范围为97至107。
需要说明的是,步骤303并非为必须执行的步骤,如果模型误差范围较小,或者忽略模型的误差范围时,该步骤303可以不执行。
步骤304,服务端201根据目标KV对的插入范围,确定可能存储有目标KV对的内存单元(记为目标内存单元)。
首先,介绍本申请实施例提供的一种内存数据结构,继续参见图5,本申请将内存213中,用于存储初始KV序列的一段连续的内存空间划分为多个内存单元(blcok)。其中,每个内存单元的大小是相同的,比如,均为4KB或均为8KB,当然,这里的数值仅为举例,对此不做具体限定。其中,一个内存单元包括初始KV序列中的一组KV对,不同的内存单元所存储的KV对不同,换言之,一个内存单元对应一个K值范围,不同内存单元对应的K值范围不同,或者说任意两个内存单元的K值范围之间没有交集。
值得注意的是,内存单元对应的K值范围,并不是该内存单元中已存储的KV对的K值范围。一个内存单元对应的K值范围,是由该内存单元的边界KV对和与该内存单元相邻的内存单元中相应的边界KV对确定的。其中,相应的边界是指同一侧的边界,如均取内存单元的左边界,或均取内存单元的右边界。
举例来说,如均取内存单元的左边界时,参见图5所示,block2中存储的首个KV对(左边界)的K值为20,block3中存储的首个KV对(左边界)的K值为100,则block2对应的K值范围为[20,99]。又如,均取内存单元的右边界时,block1中存储的末尾KV对(右边界)的K值为11,block2中存储的末尾KV对(右边界)的K值为97,则block2对应的K值范围为[11,97]。应注意,虽然两种方式计算的K值范围不同,但该内存单元的K值范围一旦确定,后续的插入操作便依据该K值范围来执行,该内存单元的K值范围在下次KV序列重构之前都不会更改。也就是说,内存单元的K值范围决定将目标KV对插入哪一个内存单元。
再示例性地,该内存单元对应的K值范围也可以由该内存单元的一个边界K值来表示,如以左边界为例,block2对应的K值范围为20以上(包括20),block3对应的K值范围为100以上(包括100)。需要注意的是,同一个KV序列中每个内存单元计算K值范围的方式是相同的。为便于说明,下文中,以内存单元的左边界的K值来表示该内存单元对应的K值范围为例进行说明。
继续参见图5,目标KV对的目标内存单元为,内存213中与该目标KV对的插入范围存在交集的一个或多个内存单元中,K值范围包括该目标KV对的K值的内存单元。如图5中,目标KV对的插入范围为[A-L,A+L],与该插入范围有交集的内存单元为block2和block3,其中,block2对应的K值范围为20以上,block3对应的K值范围为100以上,假设目标KV对的K值为96,则目标KV对的目标内存单元为block2
当然,在另一种情况中,与目标KV对的插入范围存在交集的内存单元也可能仅为一个,比如block2包括该插入范围,则该目标KV对的目标内存单元即为该一个内存单元,即block2。应理解,这种情况下,不需要再结合内存单元的K值范围确定目标内存单元。
步骤305,服务端201判断该目标内存单元是否有空闲空间写入目标KV对,若有,则执行步骤306;否则,执行步骤307。
这里的空闲空间可以是未存储数据的空间或存储有无效数据的空间,无效数据可以是待删除的数据,未存储数据的空间可以是服务端201预留的,也可以是数据被删除后留下的,下文会进行介绍。另外,由于KV对是定长字段,因此,空闲空间的长度是KV对的整数倍。
步骤306,服务端201将该目标KV对写入该目标内存单元。
本申请实施例中,客户端100以内存单元为粒度来读取内存数据,因此,在一种实施方式中,如果目标内存单元有空闲空间,不论该空闲空间的位置在哪里,均可以将目标KV对直接写入该空闲空间,保持其他KV对的位置不变,也就是说,写入后该目标内存空间内的KV对可能是无序的,比如,目标KV对的K值96,写入该KV对后,该目标内存单元的KV对包括…,35,96,37,…。这样可以减少写操作的工作量。在另一种实施方式中,也可以以保证目标内存空间中的KV对有序为目的,在目标内存单元中写入目标KV对。应注意,上述两种方式,均需要保证在两次模型训练之间,每个内存单元的首个KV对不变,即内存单元对应的K值范围不变即可。
步骤307,服务端201将该目标内存单元转变为根内存单元,并更新目标内存单元和目标内存单元的子内存单元。
如果目标内存单元已满,即没有空闲空间,则服务端201将该目标内存单元转变为根内存单元,为该目标内存单元分配一个或多个子内存单元。为便于描述,如下将根内存单元称为根块,将子内存单元称为子块。
图6为本申请实施例提供的一种根块和子块的示意图。其中,根块包括块头部和数据部分,数据部分用于存放子块的信息,可选的,还可以存放KV对。下文会对根块的数据结构进行详细说明,此处不再赘述。具体的,子块可以是定长块也可以是变长块,定长块是指每个子块的大小(或者说长度)均相同,比如每个子块均为4KB,或均为8KB,子块的大小与根块的大小可以相同也可以不同,不做具体限定。当然,该数值仅为举例,具体不做限定。变长块是指子块的长度可以调整,如对子块进行扩容或缩容。子块为除内存213中用于存储初始KV序列的连续内存空间之外的一段内存,子块和根块是不连续的,子块和子块之间可以是连续的,也可以是不连续的。
在本申请中,根据根块是否用于存储KV对,存在两种更新方式,如下结合图5及图6所示的数据结构,列举目标内存单元和目标内存单元的子块的两种更新方式,在下文中,将以目标KV对的K值为96,目标内存单元为block2为例进行介绍:
更新方式一:根块不用于存储KV对;
(1)将目标内存单元的KV对和目标KV对写入子块;
参见图7的(a)示出了更新前目标内存单元的示意图,服务端201将目标内存单元中的KV序列(记为第一KV序列)和目标KV对全部迁入目标内存单元的子块中。该过程可以包括:获取第一KV序列,将目标KV对96插入第一KV序列,得到一个新的KV序列(记为第二KV序列),其中,第二KV序列内的KV对按K值升序排列;将第二KV序列顺序写入目标内存单元的一个或多个子块,参见图7的(b)。示例性地,可以先写满一个子块之后,再写下一个子块,以提高内存利用率。或者,也可以在子块中预留部分空闲空间,以方便后续在该子块的插入操作。
当子块为定长块时,子块的数量可能是多个,其中每个子块分别用于存储第二KV序列中的部分KV对,也即子块对应的K值范围为根块对应的K值范围的子集。且每个子块内的KV对为有序的,这样有利于进行范围查询。值得注意的是,在重构KV序列,或者说两次模型训练期间,子块的数量可以扩展或合并,本申请对此不做限定。
当子块为变长块时,子块的数量为1,该子块对应的K值范围与根块对应的K值范围相同,该子块具有一个初始长度,当该子块写满后,可以再为该子块扩容,比如,初始长度为6KB,随着插入的KV对的增多,扩容后子块长度为8KB,或者,该子块中的KV对被删除后,可以对该子块进行缩容,以提高内存利用率。
(2)更新目标内存单元中的信息。
继续参见图7的(b)所示,目标内存单元的块头部包括但不限于:用于指示目标内存单元是否具有子块的指示信息,该指示信息包括1个比特位,如该1个比特位上的比特的值为0时,可以表示目标内存单元为原始块(original block),即该目标内存单元不具有子内存单元。该1个比特位上的比特的值为1时,表示该目标内存单元为根块(root block),即该目标内存单元具有子块。需要说明的是,这里仅为举例,也可以是该指示信息的值为1表示根块,指示信息的值为0表示原始块,下文相似之处,不再赘述。
目标内存单元的数据部分包括但不限于:各子块的信息,其中一个子块的信息包括但不限于:该子块的地址信息、该子块的K值范围中的一项或多项。以子内存单元的信息为(K值范围,地址信息)为例,如图7的(b)所示,目标内存单元中包括子块1的信息(20,子块1_address)、子块2的信息(50,子块2_address)。其中,子块的K值范围以子块的左边界KV对的K值表示。
更新方式二:根块存储KV对;
(1)将第二KV序列顺序存储至目标内存单元和目标内存单元的子块。
示例性地,在写第二KV序列时,可以先写子块,再写目标内存单元,如图8的(a)所示,子块存储有第二KV序列的前部分KV对,目标内存单元存储有第二KV序列的后部分KV对。再示例性地,也可以先写目标内存单元,再写子块,参见图8的(b)所示,目标内存单元存储第二KV序列的前部分KV对,子块存储第二KV序列的后部分KV对。该方式能够较充分地利用目标内存单元的空间,以提高内存利用率。
(2)将各子块的信息写入目标内存单元。
目标内存单元的数据部分包括每个子块的信息(K值范围,地址信息)和第二KV序列的部分KV对,其中,子块的信息参见前述的说明,此处也不再赘述。其中,每个KV对或子块的信息之前还包括一个比特位的指示信息(记为第二指示信息),第二指示信息用于指示对象的类型,该对象包括KV对子块的信息,如第二指示信息的值为0时,表示其后的对象为KV对;若值为1时,表示其后的对象为子块的信息。
目标内存单元的块头部包括但不限于:用于指示目标内存单元是否具有子块的指示信息(记为第一指示信息),参见上述相关说明,此处不再赘述。需要说明的是,每个对象对应的第二指示信息也可以组成比特位图,该比特位图也可以放置于目标内存单元的块头部中,该比特位图中的一个比特与数据部分中的一个对象一一对应。
至此,完成了该KV对的插入操作,客户端100与服务端201可以重复上述步骤,以完成多次插入操作。多次插入操作可以是串行插入,也可以是并行插入。需要说明的是,并非每次插入操作均需要在根块中更新子块的信息,若子块的信息没有变化,则无需更新子块信息的更新。如,以图7为例,如果新的待写入的KV对(如KV对21)的目标内存单元仍是block2,则可以将该待写入的KV对21直接写入子块1,不需要更新blcok2中子块1的信息。
需要说明的是,(1)上述示出根块和子块的数据结构仅为举例,本申请中根块、子块还可以包括其他信息,如数据部分还可以包括每个对象的删除标记,用于指示该对象是否被删除,下文会进行介绍,此处不做赘述。(2)在本申请中,原始块也可以包括块头部和数据部分,上述各附图中未示出,其中,块头部包括该内存单元的第一指示信息,可以参见对根块的介绍,此处不再赘述。
通过上述设计,服务端201可以在保证原始KV序列的定位准确性的基础上,及时写入目标KV对,即使插入目标KV对后初始KV序列改变,仍不会影响客户端100侧的单边读,因此,服务端201和客户端100之间不需要频繁交互变化后KV对的位置等相关信息,节省网络带宽和网络传输资源,以及降低了服务端201的计算开销。并且,能够同时支持点查和范围查,并且无论点查还是范围查,客户端100都能够全程通过单边读的方式完成,进一步节省服务端201侧的计算开销,同时降低了业务时延。
如下对KV对的删除操作进行介绍:
步骤308,服务端201接收客户端100发送删除请求,该删除请求用于请求删除指定KV对。
步骤309,服务端201确定该指定KV对在内存213中的目标内存单元。
如,服务端使用已训练的模型确定该指定KV对的存储位置,并根据模型输出的存储位置和该模型的误差范围确定该指定KV对的存储范围,之后,服务端201确定该指定KV对的目标内存单元,即与存储范围存在交集的一个或多个内存单元中,K值范围包括该指定KV对的K值的内存单元。具体步骤参见前述的相关说明,此处及下文均不再赘述。
步骤310,服务端201在目标内存单元中查找该指定KV对;若命中,则对该指定KV对执行删除操作,否则,向客户端100返回删除失败响应,参见相关技术的说明,以下讨论命中的情况:
示例性地,删除操作可以是仅对该指定KV对做删除标记,将其标记为待删除数据,而不改变各KV对的位置,在重构KV序列时再删除带有删除标记的KV对,从而减少写操作的数量。
类似于第二指示信息,内存单元的数据部分中,每个对象(包括KV对,还可以包括子块的信息)前还可以放置一个删除信息,该删除信息包括一个比特位,该比特位上的比特的不同值用于指示该对象是否为待删除数据,如该值为0可以表示该对象为有效数据,即不需要删除;如果该值为1,则可以表示该对象为待删除数据。也就是说,这里只是将指定KV对标记为待删除数据,实际上还未删除。需要说明的是,类似于第二指示信息,每个对象的删除信息可以位于该对象之前,也可以组成一个比特位图存储在目标内存单元的块头部,本申请对此不做限定。
当然,删除操作也可以直接将指定KV对删除,但是该方式可能会触发子块的合并,比如,图7的(b)中,目标内存单元有两个子块,分别为子块1和子块2,如果将子块1、子块2的部分KV对删除后,可以将子块1和子块2合并,如将子块2中的全部KV对迁移至子块1中,子块合并之后,在根块中更新子块的信息,如删除掉被合并的子块的信息、或对子块的信息做删除标记、更新子块的地址信息、更新子块对应的K值范围等。
如下对KV对的更新操作进行介绍:
服务端201接收客户端100发送的更新请求,该更新请求用于请求更新指定KV对中的数据(V),该更新请求携带待更新的KV对。更新操作可以更新根块中的KV对,也可以更新子块中的KV对,如,以图8的(b)为例,该更新请求携带新的KV对(97,Vm'),服务端201使用Vm'替换掉在子块1中Vm,更新操作与插入操作类似,此处不再赘述
需要说明的是,插入操作(步骤301至步骤307)、删除操作(步骤308至步骤311)、更新操作之间没有时序限定,可以并行执行也可以串行执行,串行执行的顺序也没有限定,如可能是先执行插入操作,再执行删除操作,之后执行更新操作,也可能是先执行删除操作,再执行插入操作,后执行更新操作等等,另外,删除操作和更新操作并非为必须执行的步骤,也即不一定每次执行插入操作都伴随有删除操作或更新操作,也可以仅执行插入操作,本申请对此不做限定。
步骤311,当达到预设重构条件时,服务端201重构KV序列。
重构条件包括训练时间间隔达到预设时长,或者,插入的KV对的数量达到预设数量。
示例性地,当达到重构条件时,服务端201将内存213中用于存储初始KV序列的连续多个内存单元中存储的有效KV对和全部子块中存储的有效KV对合并,得到重构后的KV序列(重构后的KV序列内KV对仍按K值大小顺序排列),并将重构后的KV序列重新写入内存213的连续的多个内存单元中。
步骤312,服务端201基于重构后的KV序列生成训练样本,并使用该训练样本对模型进行重新训练。
训练过程的具体实现步骤可以参见步骤302中的相关介绍,此处不再赘述。需要说明的是,如果初始KV序列中,从起始位置至之后一段连续空间内的KV对的位置均未改变,比如,假设初始KV序列所在的block1至block99中的KV对均为改变,即未插入新的KV对,则在进行重构时,这部分KV对不需要在内存213中重复写,同理,也不需要重复训练。另外,模型训练过程也可以由其他设备(如云服务器)完成,其他设备将训练后的模型发送给服务端201,以节省服务端201的计算开销。
步骤313,服务端201将训练后的模型和该模型的误差范围发送至客户端100。
在一种实施方式中,在模型训练完成后,服务端201主动将训练后的模型和模型的误差范围发送给客户端100。由于服务端201可以为若干客户端100提供数据存取服务,因此,服务端201可以通过广播的方式,将训练后的模型和模型的误差范围通知给所有客户端100,这种同步方式比较简单。
在另一种实施方式中,可以在客户端100发起请求时,服务端201再将训练后的模型及该模型的误差范围发送给客户端100。如,客户端100在每次使用模型前进行一致性校验,在服务端侧,服务端201在更新模型后,修改该模型的一致性校验信息,当客户端设备通过一致性校验发现不一致时,向服务端201发起请求以请求获取最新的模型,这种同步方式,可以减少网络通信。
当然,上述两种方式中,如果模型的误差范围没有变化,或在不考虑模型的误差范围时,也可以只发送训练后的模型。客户端100获取到该训练后的模型之后,可以基于该训练后的模型(及模型的误差范围)来预测待查询的KV对在内存213中的位置,从而通过RDMA单边读的方式执行KV对的查询操作。
接下来结合图9对本申请实施例提供的读数据方法所对应的流程进行介绍,
图9为本申请实施例提供的读数据方法所对应的流程示意图。在图9所示的方法中,将以点查为例,对KV对的查询操作进行介绍,如图9所示,该方法可以包括如下步骤:
步骤901,客户端100预测待查询的KV对(记为目标KV对)在服务端201的内存213中的存储位置。
步骤902,客户端100根据模型预测的存储位置和该模型的误差范围确定该目标KV对的存储范围。
步骤903,客户端100确定与该存储范围存在交集的内存区域(记为目标查询区域),该目标查询区域包括一个或多个内存单元。
本申请实施例,客户端100以内存单元为粒度来读取数据,因此,参见图10所示,假设步骤901中模型预测的目标KV对的存储位置为B点,该模型的误差范围为L,则在步骤902中该目标KV对的存储范围为[B-L,B+L],目标查询区域包括与目标KV对的存储范围存在交集的一个或多个内存单元。如图10的(a)所示,目标查询区域包括一个内存单元,如图10的(b)所示,目标查询区域包括多个内存单元。可以看出,与目标KV对的存储范围存在交集的多个内存单元是连续的,即目标查询区域内的多个内存单元是连续的。其中,步骤901至步骤903可以参见步骤302至步骤303的相关介绍,此处不再赘述。
若目标KV对的存储范围与多个内存单元存在交集时,在一种可选的实施方式中,若客户端100缓存有内存213中每个内存单元与该内存单元的首个K值的对应关系时,客户端100还可以结合该对应关系,进一步确定可能存储该目标KV对的内存单元,即K值范围包括该目标KV对的K值的内存单元。这样,客户端100可以仅读取该内存单元的数据,即目标查询区域为该内存单元。若客户端100未缓存该对应关系,则目标查询区域即为与目标KV对的存储范围存在交集的一个或多个内存单元。应理解,大部分情况下,目标KV对的存储范围只与一个内存单元存在交集,为便于说明,如下将目标查询区域所包括的每个内存单元称为目标内存单元。
应注意,这里的目标查询区域是指服务端201的内存213中可能存储有该目标KV对的区域。实际上,客户端100并不能确定服务端201是否存储有该目标KV对,但可以确定的是,若服务端201存储有该目标KV对,则一定存储在该目标查询区域中。
步骤904,客户端100判断客户端100中是否缓存有其中一个目标内存单元的数据,如果未缓存,则执行步骤905,如果缓存了,则执行步骤912。
本申请中,客户端100可以将读取到的根块的数据缓存下来。这里的根块的数据包括根块中记录的子块的信息,若根块还存储有KV对,则根块中存储的KV对可以不缓存。
客户端100内未缓存该目标内存单元的数据,一种可能为,客户端100是首次读取该目标内存单元的数据。另一种可能为,客户端100读取过该目标内存单元的数据,但该目标内存单元不是根块。第三种可能是,客户端100读取过该目标内存单元的数据,且该目标内存单元是根块,但可能由于客户端100内存有限等原因,未缓存该目标内存单元数据。
如果目标查询区域内所包括的一个或多个目标内存单元的数据均未缓存,则执行步骤905。
步骤905,客户端100向服务端201发送RDMA读请求(记为第一RDMA读请求),以获取目标查询区域的数据。
该第一RDMA读请求,用于请求读取目标查询区域的数据。示例性地,该第一RDMA读请求携带该目标查询区域的地址信息,如该目标查询区域所包括的一个或多个连续的目标内存单元的首地址+长度。应注意,这里是读取目标查询区域的数据,而不是目标内存单元。这样,当目标查询区域包括多个目标内存单元时,可以通过一个RDMA读请求读取该多个连续的目标内存单元的数据,以减少读IO的数量。
步骤906,服务端201的网卡214从内存213中获取该目标查询区域中的数据,并将该数据发送给客户端100。应理解,该目标内存区域的数据包括一个或多个连续的目标内存单元中每个目标内存单元的数据。
步骤907,客户端100根据目标查询区域的数据,判断是否存在目标子块,若不存在,则执行步骤908;若存在,则执行步骤909。
需要说明的是,步骤907并非为必须执行的步骤,比如,目标查询区域仅包括一个目标内存单元,且目标内存单元不用于存储KV对,则该目标内存单元的子块即为目标子块。
客户端100可以根据目标内存单元的第一指示信息,或数据部分是否存储有子块的信息,来判断目标内存单元是否为根块,参见上文对根块数据结构的介绍,此处不再赘述。
若目标查询区域中的一个或多个目标内存单元中,存在至少一个目标内存单元为根块,则继续判断该目标内存单元的一个或多个子块中,是否包括目标子块,目标子块是指K值范围包括该目标KV对的K值的子块。其中,该目标内存单元中会记录其子块的信息,这里以子块的信息包括子块的K值范围和地址信息为例,参见上文的介绍,此处不再赘述。
步骤908,客户端100在该目标查询区域的数据中查找目标KV对,无论是否查找到,均结束本轮查询操作。
值得注意的是,服务端201的内存213中可能存储有该目标KV对,也可能未存储该目标KV对,也就是说,查询结果可能是命中(即查询到目标KV对),也可能是未命中。基于前述的,客户端100可以确定的是,若服务端201存储有该目标KV对,则一定存储在该目标查询区域中,因此未命中,则客户端100能够确定服务端201的内存213中未存储该目标KV对,也因此,无论是否命中,都结束本轮查询操作,下文类似之处,不再赘述。
步骤909,客户端100向服务端201发送RDMA读请求(记为第二RDMA读请求),以获取目标子块的数据。即第二RDMA读请求用于请求读取目标子块的数据。
步骤910,服务端201的网卡214从内存213中获取该目标子块中的数据,并将该数据发送给客户端100。
步骤911,客户端100在该目标子块的数据中查找目标KV对,无论是否查找到,均结束本轮查询操作。
上述是以子块的信息包括子块的地址信息和子块的K值范围为例进行说明的,在一种实施方式,子块的信息可以只包括子块的地址信息,示例性地,如果目标内存单元只有一个子块,则在目标查询区域的数据未命中目标KV对时(若根块用于存储KV对),发送用于读取该子块数据的第二RDMA读请求。再示例性地,如果目标内存单元有多个子块,且该多个子块不连续,则在目标查询区域的数据未命中目标KV对时(若根块用于存储KV对),可以通过并行的多个第二RDMA读请求,即并行执行步骤908,以分别读取该多个子块的数据,其中一个第二RDMA读请求中携带有一个子块的地址信息。如果该多个子块连续,则也可以通过一个第二RDMA读请求来读取该多个子块的数据。
上述查询方式,如果未缓存该目标内存单元的数据,则首先通过一个RDMA单边读(如第一RDMA读请求)将该目标查询区域的数据读取上来,如果该目标查询区域为原始块,则可以直接在该目标内存单元的数据中查找目标KV对。如果该目标内存单元为根块且根块中未命中该目标KV对,则再发起一个RDMA单边读(如第二RDMA读请求)将目标内存单元的子块的数据读上来,并在子块的数据中继续查找目标KV对。在本申请中,可以通过一次RDMA单边读或两次RDMA单边读来完成,无论是否命中目标KV对,均结束查询操作,不需要通过双边读的方式确定服务端201是否存储有目标KV对,提供了完全单边读的查询方式,可以节省服务端201的计算开销,提高读性能。
如下对客户端100缓存有目标内存单元的数据的查询方式进行介绍:
在本申请中,客户端100仅缓存根块的数据,不缓存原始块的数据,或者也可以缓存原始块的数据,但指定专属缓存区域用于专门缓存根块的数据,客户端100查询该专属缓存区域内是否缓存目标内存单元的数据,若缓存,则说明目标内存单元为根块。
步骤912,客户端100根据缓存的目标内存单元的数据,判断该目标查询区域内的一个或多个目标内存单元的子块是否存在目标子块,若存在,则执行步骤913,否则,执行步骤905。
一种可能的情况,缓存的目标内存单元的数据所记录的子块中,K值范围均不包括该目标KV对的K值,则确定不存在目标子块。
步骤913,客户端100根据缓存的目标内存单元的数据(记为第一数据),并行发送两个RDMA读请求(分别记为第三RDMA读请求、第四RDMA读请求),以获取目标查询区域的数据(包括目标内存单元的数据(记为第二数据))和目标子块的数据(第三数据)。其中,第三RDMA读请求,用于请求读取目标查询区域的第二数据。第四RDMA读请求,用于请求读取目标子块的第三数据。
步骤914,服务端201的网卡214分别从内存213中获取目标查询区域的第二数据,从内存213中获取目标子块的第三数据,并将该第三数据、第四数据发送给客户端100。
步骤915,客户端100将第一数据和第二数据进行比对,判断目标子块是否改变,如果未改变,则执行步骤916;如果改变,执行步骤917。
第一数据包括目标内存单元的每个子块的第一地址信息和第一K值范围;第二数据包括目标内存单元的每个子块的第二地址信息和第二K值范围;若目标子块的地址发生变化,如目标子块的第一地址信息和第二地址信息不同,比如,在第一数据中,目标子块为子块1,第二数据中,目标子块为子块2,这种情况多发生于子块分解的情况(即子块数量扩展),又或者,在第一数据中,目标子块为子块2,第二数据中,目标子块为子块1,这种情况多发生于子块合并的情况,则确定子块改变;否则,确定子块未改变。
步骤916,客户端100在第三数据中查找目标KV对,无论是否查询到目标KV对,都结束本轮的查询操作。
如果目标子块未改变,则说明客户端100按照缓存的第一数据中记录的目标子块的地址信息读回的数据(即第三数据)有效,客户端100在第三数据中查找目标KV对。
步骤917,客户端100根据第二数据,生成并发送第五RDMA读请求,以获取新的目标子块的数据(第四数据)。
示例性地,第五RDMA读请求中携带第二数据中记录的目标子块的第二地址信息,用于请求该新的目标子块的数据,即第四数据。
步骤918,服务端201的网卡214从内存213中获取该新的目标子块中的第四数据,并将该数据发送给客户端100。
步骤919,客户端100在该第四数据中查找目标KV对,无论是否查询到目标KV对,都结束本轮的查询操作。
上述是以子块的信息包括子块的地址信息和子块的K值范围为例进行说明的,在一种实施方式,子块的信息可以只包括子块的地址信息,应注意,这种情况中,目标子块不再是K值范围包括目标KV对的K值的子块,而是该缓存的目标内存单元的数据中记录的任一子块,或者说,不需要执行步骤910,直接执行步骤911。示例性地,如果目标内存单元只有一个子块,则在目标查询区域的数据未命中目标KV对时(若根块用于存储KV对),发送用于读取该子块数据的第四RDMA读请求。再示例性地,如果目标内存单元有多个子块,且该多个子块不连续,则在目标查询区域的数据未命中目标KV对时(若根块用于存储KV对),可以通过并行的多个第四RDMA读请求,以分别读取该多个子块的数据,其中一个第四RDMA读请求中携带有一个子块的地址信息。如果该多个子块连续,则也可以通过一个第四RDMA读请求来读取该多个子块的数据。
需要说明的是,上述查询过程中,客户端100可以将首次读取到的根块,或发生变化的根块的数据缓存下来,这样,后续再读取该根块时,也只需要一次并行的RDMA单边读即可。
上文介绍了点查流程,本申请还可以进行范围查询,如下对范围查询流程进行介绍:
范围查询与点查类似,区别在于,点查是查询一个KV对,而范围查询是查询一段连续K值范围内的KV对,如参见图11所示,假设范围查询的k值范围为[KL,KR],客户端100以点查的方式,分别确定两个边界K值KL和KR对应的存储位置,之后,结合模型的误差范围确定两个边界K值的存储范围,根据两个边界K值的存储范围确定的本次范围查询的最大查询范围,即目标查询区域,包括多个内存单元。之后的查询步骤与点查相似,具体实现步骤,参见图9的相关步骤,此处不再赘述。
上述查询方式,如果客户端100缓存有目标内存单元的数据,则可以通过两个并行的RDMA单边读(第三RDMA读请求和第四RDMA读请求)来获取目标内存单元的数据以及目标子块的数据。若新读回来的目标内存单元的数据与缓存的该目标内存单元的数据相比,目标子块的地址未发生变化,则说明读回的子块的数据是有效的,可以在该子块的数据中查询目标KV对。如果目标子块的地址发生变化,则说明按照缓存的数据读回的子块的数据是无效的,客户端100重新通过(串行的)两次RDMA单边读(第一次第三RDMA读请求和第四RDMA读请求,第二次第五RDMA读请求)来读取该变化后的目标子块的数据,并在该目标子块的数据查找目标KV对。本申请实施例提供的读数据方法,能够同时支持点查和范围查询,并且无论点查还是范围查询,均可以通过一次并行的RDMA单边读,或两次RDMA单边读来完成,不需要通过双边读的方式即可以完成查询操作,可以节省服务端201的计算开销,提高读性能。
如下对本申请两次单边读的概率进行分析:
假设KV对的长度为32B,一个内存单元为8KB,则每个内存单元中最多可以存放256个KV对,由于当前系统要求支持千亿级规模,设为237对KVs,则内存213中用于存储KV对的连续内存空间包括:237/28=229个blocks。
客户端100只需要缓存根块的数据,而重构KV序列之后,根块全部转变为原始块,因此,这里只需要考虑两次训练之间可能产生的根块的数量。
若服务端201单节点的IOPS为9W,假设写IO比例为50%左右,则每秒的写IO数量为4.5W。假设重构条件为插入KV对的数量达到45W个或者定时10秒,则在插入45W个KV后触发重训练。
假设最坏的情况,45W个KV对都插入到内存213中的不同block上,且都导致下沉,则产生45W个根块,若想将服务端201的根块的数据全部缓存,则客户端100需要45W*8KB=3.6GB。若客户端100仅能提供2GB,则只能缓存56%左右的根块。若客户端100仅能提供很小的缓存空间,比如360MB,则只能缓存10%的根块,即有90%的根块不能被缓存,即45W*90%=40.5W。
假设查询操作均匀分布,则未缓存的根块被读取的概率为40.5W/229<0.0008,也即本申请中需要发起两次单边读的概率小于0.0008。也就是说,基于上述图9所示的读数据方法,大部分查询都能够通过一次RDMA单边读或者一次并行的RDMA单边读完成,只有很少量的查询需要两次RDMA单边读完成,较大地提升了系统的读性能。
在一种优化方式中,客户端100可以进一步结合根块的热度,选择热度值高的根块缓存下来,以提高后续查询的命中率,进一步降低两次单边读的概率。示例性地,根块的热度值可以通过记录单位时间内读取根块的频次来统计,单位时间被访问的频次越高,则该根块的热度值也越高。
本申请针对缓存目标内存单元的数据的情况,还提供了另一种读数据方法:
在该方法中,若在步骤912中客户端100确定有目标子块,则在示例二中,执行步骤920,客户端100根据缓存的目标内存单元的数据,生成并发送用于读取目标子块数据的RDMA读请求(第六RDMA读请求),以获取目标子块的数据(参见步骤921)。步骤922,客户端100根据该目标子块的数据判断目标子块是否有改变,如果有,则执行步骤905,如果没有改变,则客户端100在该目标子块的数据中查找目标KV对,无论是否命中,均结束本轮查询操作。
上述查询方式,客户端100在缓存有目标内存单元的数据的情况,可以通过一次RDMA单边读或(串行的)三次RDMA单边读完成查询操作。由于,本申请中,在缓存有根块的数据,且子块的信息发生改变的概率很低,因此,大部分查询操作可以通过一次RDMA单边读完成,可以节省网络带宽,极少数的查询操作需要通过三次RDMA单边读完成,虽然,增加了部分查询操作的时延,但节省了大部分查询操作的网络带宽。
需要说明的是,本申请实施例的查询操作也可以通过双边读方式完成,如客户端100将读请求发送至服务端201,由服务端201的处理器212获取读请求所请求读取的数据,本申请查询操作的方式不做限定。
基于与方法实施例同一发明构思,本申请实施例还提供了另一种计算装置,该计算装置用于执行上述图3方法实施例中服务端201执行的方法。如图12所示,计算装置1200包括获取模块1201、更新模块1202;可选的,还可以包括处理模块1203、发送模块1204;具体地,在计算装置1200中,各模块之间通过通信通路建立连接。
获取模块1201,用于获取待写入内存的键值KV对;所述内存包括连续的多个内存单元;具体实现方式请参见图3中的步骤301的描述,此处不再赘述。
更新模块1202,用于在当所述待写入的KV对对应的内存单元已满时,更新所述内存单元;更新后所述内存单元存储有所述内存单元的子内存单元的信息,所述子内存单元用于存储K值在所述内存单元对应的K值范围的KV对。具体实现方式请参见图3中的步骤305、307的描述,此处不再赘述。
在一种可能的实现方式中,所述处理模块1203,用于通过下列方式确定所述待写入的KV对对应的内存单元:将所述待写入的KV对的K值输入至已训练的模型,得到所述待写入的KV对在所述连续的多个内存单元中的插入位置;具体实现方式请参见图3中的步骤302的描述,此处不再赘述。根据所述模型的误差范围和所述插入位置,确定所述待写入的KV对在所述多个内存单元中的插入位置范围;具体实现方式请参见图3中的步骤303的描述,此处不再赘述。其中,所述模型是基于所述多个内存单元中所存储的KV对的K值和所述KV对在所述多个内存单元中的存储位置训练后得到的;所述待写入的KV对对应的内存单元为,所述插入位置范围所在的一个内存单元或多个内存单元中,K值范围包括所述待写入KV对的K值的内存单元。具体实现方式请参见图3中的步骤304的描述,此处不再赘述。
在一种可能的实现方式中,所述处理模块1203,还用于当达到预设重构条件时,将所述连续的多个内存单元中每个内存单元的子内存单元中所存储的KV对与所述多个内存单元中存储的KV对合并,得到第二KV对序列,所述第二KV序列中的KV对按照K值大小顺序排列,所述第二KV对序列存储于所述内存中;使用所述第二KV对序列重新训练所述模型。具体实现方式请参见图3中的步骤311、步骤312的描述,此处不再赘述。
在一种可能的实现方式中,发送模块1204,还用于将训练后的模型,或训练后的模型和该模型的误差范围发送给客户端100。具体实现方式请参见图3中的步骤302或步骤313的描述,此处不再赘述。
基于与方法实施例同一发明构思,本申请实施例还提供了另一种计算装置,该计算装置用于执行上述图9方法实施例中客户端100执行的方法。如图13所示,计算装置1300包括预测模块1301、处理模块1302和通信模块1303;具体地,在计算装置1300中,各模块之间通过通信通路建立连接。
预测模块1301,用于预测服务器内存中存储有待读取键值KV对的内存区域,所述内存区域包括一个或多个连续的内存单元;具体实现方式请参见图9中的步骤901或步骤902或步骤903的描述,此处不再赘述。
处理模块1302,用于根据缓存的其中一个内存单元的第一数据,控制通信模块向所述服务器发送第一读请求;其中,所述第一数据包括所述内存单元的第一子内存单元的第一地址信息;所述第一读请求用于请求读取所述第一子内存单元中的数据;具体实现方式请参见图9中示例一中的步骤913的描述或示例二中步骤920的描述,此处不再赘述。
通信模块1303,还用于接收所述服务器发送的所述第一子内存单元存储的数据。具体实现方式请参见图9中示例一中的步骤914的描述或示例二中步骤921的描述,此处不再赘述。
在一种可能的实现方式中,所述第一数据还包括所述子内存单元对应的K值范围,所述K值范围包括所述待读取KV对的K值。
在一种可能的实现方式中,所述通信模块1303向所述服务器发送第一读请求的同时,还用于:并行向所述服务器发送第二读请求,所述第二读请求用于请求读取所述内存区域中的数据;接收所述服务器发送的所述数据,所述数据包括所述内存单元存储的第二数据;具体实现方式请参见图9中示例一中的步骤914的描述,此处不再赘述。
若所述第一数据与所述第二数据不同(具体实现方式请参见图9中步骤915的描述,此处不再赘述。),所述处理模块1302还用:根据所述第二数据中记录的第二子内存单元的第二地址信息,控制所述通信模块向所述服务器发送第三读请求,所述第三读请求用于请求读取所述第二地址信息指示的第二子内存单元的数据;具体实现方式请参见图9中步骤917的描述,此处不再赘述。所述通信模块还用于:接收所述服务器发送的所述第二子内存单元的数据。具体实现方式请参见图9中步骤918的描述,此处不再赘述。所述处理模块1302,还用于在该第二子内存单元的数据中查找目标KV对。具体实现方式请参见图9中步骤919的描述,此处不再赘述。或者,
若所述第一数据与所述第二数据相同,所述处理模块1302,还用于在该第一子内存单元的数据中查找目标KV对。具体实现方式请参见图9中步骤908的描述,此处不再赘述。
在一种可能的实现方式中,所述在所述预测模块预测服务器内存中存储有待读取键值KV对的内存单元之前,所述通信模块1303还用于:接收所述服务器发送的所述已训练的模型和所述模型的误差范围。具体实现方式请参见图3中步骤302或步骤312中的描述,此处不再赘述。
在一种可能的实现方式中,所述通信模块1303还用于:在所述客户端未缓存所述内存区域的数据时,向所述服务端发送第二读请求,所述第二读请求用于请求读取所述内存区域的数据;接收所述服务端发送的所述内存区域的数据,所述数据包括所述内存区域所包括的一个或多个内存单元的数据;具体实现方式请参见图9中步骤905、步骤906的描述,此处不再赘述。
若所述一个或多个内存单元中的其中一个内存单元包括子内存单元,则所述处理模块1302还用于:根据所述内存单元的数据,控制所述通信模块向所述服务端发送第三读请求,所述第三读请求用于请求读取所述子内存单元的数据;所述内存单元的数据包括所述子内存单元的地址信息;所述通信模块1303还用于:接收所述服务端发送的所述子内存单元的数据。具体实现方式请参见图9中步骤909、步骤910的描述,此处不再赘述。
本申请实施例还提供一种计算机存储介质,该计算机存储介质中存储有计算机指令,当该计算机指令在计算机上运行时,使得计算机执行上述相关方法步骤以实现上述实施例中的服务端201所执行的方法,参见图3各步骤的描述,此处不再赘述,或实现上述实施例中的客户端100所执行的方法,参见图9各步骤的描述,此处不再赘述。
本申请实施例还提供了一种计算机程序产品,当该计算机程序产品在计算机上运行时,使得计算机执行上述相关步骤,以实现上述实施例中的服务端201所执行的方法,参见图3各步骤的描述,此处不再赘述,或实现上述实施例中的客户端100所执行的方法,参见图9各步骤的描述,此处不再赘述。
另外,本申请的实施例还提供一种装置,这个装置具体可以是芯片,组件或模块,该装置可包括相连的处理器和存储器;其中,存储器用于存储计算机执行指令,当装置运行时,处理器可执行存储器存储的计算机执行指令,以使芯片执行上述各方法实施例中的服务端201所执行的方法,参见图3各步骤的描述,此处不再赘述,或实现上述实施例中的客户端100所执行的方法,参见图9各步骤的描述,此处不再赘述。
其中,本申请实施例提供的计算装置、计算机存储介质、计算机程序产品或芯片均用于执行上文所提供的客户端100或服务端201对应的方法,因此,其所能达到的有益效果可参考上文所提供的对应的方法中的有益效果,此处不再赘述。
通过以上实施方式的描述,所属领域的技术人员可以了解到,为描述的方便和简洁,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。
在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其他的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个装置,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其他的形式。
作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是一个物理单元或多个物理单元,即可以位于一个地方,或者也可以分布到多个不同地方。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元(或模块)可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个可读取存储介质中。基于这样的理解,本申请实施例的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该软件产品存储在一个存储介质中,包括若干指令用以使得一个设备(可以是单片机,芯片等)或处理器(processor)执行本申请各个实施例方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(read only memory,ROM)、随机存取存储器(random access memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
可选的,本申请实施例中的计算机执行指令也可以称之为应用程序代码,本申请实施例对此不作具体限定。
在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本申请实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包括一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,DVD)、或者半导体介质(例如固态硬盘(Solid State Disk,SSD))等。
本申请实施例中所描述的各种说明性的逻辑单元和电路可以通过通用处理器,数字信号处理器,专用集成电路(ASIC),现场可编程门阵列(FPGA)或其它可编程逻辑装置,离散门或晶体管逻辑,离散硬件部件,或上述任何组合的设计来实现或操作所描述的功能。通用处理器可以为微处理器,可选地,该通用处理器也可以为任何传统的处理器、控制器、微控制器或状态机。处理器也可以通过计算装置的组合来实现,例如数字信号处理器和微处理器,多个微处理器,一个或多个微处理器联合一个数字信号处理器核,或任何其它类似的配置来实现。
本申请实施例中所描述的方法或算法的步骤可以直接嵌入硬件、处理器执行的软件单元、或者这两者的结合。软件单元可以存储于RAM存储器、闪存、ROM存储器、EPROM存储器、EEPROM存储器、寄存器、硬盘、可移动磁盘、CD-ROM或本领域中其它任意形式的存储媒介中。示例性地,存储媒介可以与处理器连接,以使得处理器可以从存储媒介中读取信息,并可以向存储媒介存写信息。可选地,存储媒介还可以集成到处理器中。处理器和存储媒介可以设置于ASIC中。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管结合具体特征及其实施例对本申请进行了描述,显而易见的,在不脱离本申请的精神和范围的情况下,可对其进行各种修改和组合。相应地,本说明书和附图仅仅是所附权利要求所界定的本申请的示例性说明,且视为已覆盖本申请范围内的任意和所有修改、变化、组合或等同物。显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包括这些改动和变型在内。

Claims (20)

1.一种写数据方法,其特征在于,包括:
获取待写入内存的键值KV对;所述内存包括连续的多个内存单元;
若所述待写入的KV对对应的内存单元已满,则更新所述内存单元,更新后所述内存单元存储有所述内存单元的子内存单元的信息,所述子内存单元用于存储K值在所述内存单元对应的K值范围的KV对,所述待写入的KV对存储于更新后的所述内存单元或所述内存单元的子内存单元中。
2.如权利要求1所述的方法,其特征在于,所述子内存单元的信息包括所述子内存单元的地址信息;或
所述子内存单元的信息包括所述子内存单元的地址信息和第一指示信息,所述第一指示信息用于指示所述子内存单元存储的KV对的K值范围。
3.如权利要求1或2所述的方法,其特征在于,更新所述内存单元后,第一KV对序列存储于所述内存单元和所述子内存单元中,或所述第一KV对序列存储于所述子内存单元中;其中,所述第一KV对序列包括所述内存单元在被更新之前已存储的KV对和所述待写入的KV对,所述第一KV对序列内的KV对按照K值大小顺序排列。
4.如权利要求1-3任一项所述的方法,其特征在于,更新后所述内存单元还存储有第二指示信息,所述第二指示信息用于指示所述内存单元具有子内存单元。
5.如权利要求1-4任一项所述的方法,其特征在于,所述连续的多个内存单元中所存储的KV对按照K值大小顺序排列;所述待写入的KV对对应的内存单元为K值范围包括所述待写入的KV对的K值的内存单元。
6.如权利要求1-5任一项所述的方法,其特征在于,通过下列方式确定所述待写入的KV对对应的内存单元:
将所述待写入的KV对的K值输入至已训练的模型,得到所述待写入的KV对在所述连续的多个内存单元中的插入位置;
根据所述模型的误差范围和所述插入位置,确定所述待写入的KV对在所述连续的多个内存单元中的插入位置范围;
其中,所述模型是基于所述多个内存单元中所存储的KV对的K值和所述KV对在所述多个内存单元中的存储位置训练后得到的;
所述待写入的KV对对应的内存单元为,所述插入位置范围所在的一个内存单元或多个内存单元中,K值范围包括所述待写入KV对的K值的内存单元。
7.一种读数据方法,其特征在于,包括:
客户端预测服务器内存中存储有待读取键值KV对的内存区域,所述内存区域包括一个或多个连续的内存单元;
所述客户端根据缓存的其中一个内存单元的第一数据,向所述服务器发送第一读请求;其中,所述第一数据包括所述内存单元的子内存单元的第一地址信息;所述第一读请求用于请求读取所述第一地址信息指示的子内存单元中的数据;
所述客户端接收所述服务器发送的所述子内存单元存储的数据。
8.如权利要求7所述的方法,其特征在于,所述第一数据还包括所述子内存单元对应的K值范围,所述K值范围包括所述待读取KV对的K值。
9.如权利要求7或8所述的方法,其特征在于,所述客户端向所述服务器发送第一读请求的同时,还包括:
所述客户端向所述服务器发送第二读请求,所述第二读请求用于请求读取所述内存区域中的数据;
所述客户端接收所述服务器发送的所述数据,所述数据包括所述内存单元存储的第二数据;
若所述第一数据与所述第二数据不同,所述客户端根据所述第二数据中记录的子内存单元的第二地址信息,向所述服务器发送第三读请求,所述第三读请求用于请求读取所述第二地址信息指示的所述子内存单元的数据;所述客户端接收所述服务器发送的所述子内存单元的数据。
10.如权利要求7所述的方法,其特征在于,所述方法还包括:
若所述客户端未缓存所述内存区域的数据,则所述客户端向所述服务端发送第二读请求,所述第二读请求用于请求读取所述内存区域的数据;
接收所述服务端发送的所述内存区域的数据,所述数据包括所述内存区域所包括的一个或多个内存单元的数据;
若所述一个或多个内存单元中的其中一个内存单元包括子内存单元,则根据所述内存单元的数据,向所述服务端发送第三读请求,所述第三读请求用于请求读取所述子内存单元的数据;所述内存单元的数据包括所述子内存单元的地址信息;
接收所述服务端发送的所述子内存单元的数据。
11.一种计算装置,其特征在于,所述装置包括:
获取模块,用于获取待写入内存的键值KV对;所述内存包括连续的多个内存单元;
更新模块,用于在当所述待写入的KV对对应的内存单元已满时,更新所述内存单元;更新后所述内存单元存储有所述内存单元的子内存单元的信息,所述子内存单元用于存储K值在所述内存单元对应的K值范围的KV对,所述待写入的KV对存储于更新后的所述内存单元或所述内存单元的子内存单元中。
12.如权利要求11所述的装置,其特征在于,所述子内存单元的信息包括所述子内存单元的地址信息;或所述子内存单元的信息包括所述子内存单元的地址信息和所述第一指示信息,所述第一指示信息用于指示所述子内存单元存储的KV对的K值范围。
13.如权利要求11或12所述的装置,其特征在于,在所述更新模块更新所述内存单元之后,所述第一KV对序列存储于所述内存单元和所述子内存单元中,或所述第一KV对序列存储于所述子内存单元中;其中,所述第一KV对序列包括所述内存单元在被更新之前已存储的KV对和所述待写入的KV对,所述第一KV对序列内的KV对按照K值大小顺序排列。
14.如权利要求11-13任一项所述的装置,其特征在于,在所述更新模块更新所述内存单元之后,所述内存单元还存储有第二指示信息,所述第二指示信息用于指示所述内存单元具有子内存单元。
15.如权利要求11-14任一项所述的装置,其特征在于,所述连续的多个内存单元中所存储的KV对按照K值大小顺序排列;所述待写入的KV对对应的内存单元为K值范围包括所述待写入的KV对的K值的内存单元。
16.一种计算装置,其特征在于,所述装置包括:
预测模块,用于预测服务器内存中存储有待读取键值KV对的内存区域,所述内存区域包括一个或多个连续的内存单元;
处理模块,用于根据缓存的其中一个内存单元的第一数据,控制通信模块向所述服务器发送第一读请求;其中,所述第一数据包括所述内存单元的子内存单元的第一地址信息;所述第一读请求用于请求读取所述第一地址信息指示的子内存单元中的数据;
所述通信模块,还用于接收所述服务器发送的所述子内存单元存储的数据。
17.如权利要求16所述的装置,其特征在于,所述第一数据还包括所述子内存单元对应的K值范围,所述K值范围包括所述待读取KV对的K值。
18.如权利要求16或17所述的装置,其特征在于,所述通信模块向所述服务器发送第一读请求的同时,还用于:向所述服务器发送第二读请求,所述第二读请求用于请求读取所述内存区域中的数据;接收所述服务器发送的所述数据,所述数据包括所述内存单元存储的第二数据;
若所述第一数据与所述第二数据不同,所述处理模块还用:根据所述第二数据中记录的子内存单元的第二地址信息,控制所述通信模块向所述服务器发送第三读请求,所述第三读请求用于请求读取所述第二地址信息指示的所述子内存单元的数据;所述通信模块还用于:接收所述服务器发送的所述子内存单元的数据。
19.一种计算装置,其特征在于,所述存储设备包括处理器和存储器;
所述存储器,用于存储计算机程序指令;
所述处理器执行调用所述存储器中的计算机程序指令执行如权利要求1至6中任一项所述的方法,或用于执行如权利要求7或10所述的方法。
20.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质被计算装置执行时,所述计算装置执行上述权利要求1至6中任一项所述的方法,或用于执行如权利要求7或10所述的方法。
CN202210114822.7A 2022-01-30 2022-01-30 一种读、写数据方法及装置 Pending CN116560562A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210114822.7A CN116560562A (zh) 2022-01-30 2022-01-30 一种读、写数据方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210114822.7A CN116560562A (zh) 2022-01-30 2022-01-30 一种读、写数据方法及装置

Publications (1)

Publication Number Publication Date
CN116560562A true CN116560562A (zh) 2023-08-08

Family

ID=87492058

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210114822.7A Pending CN116560562A (zh) 2022-01-30 2022-01-30 一种读、写数据方法及装置

Country Status (1)

Country Link
CN (1) CN116560562A (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116991338A (zh) * 2023-09-28 2023-11-03 北京超弦存储器研究院 访问数据的方法及控制器、cxl内存模组和存储系统
CN117614956A (zh) * 2024-01-24 2024-02-27 合肥综合性国家科学中心人工智能研究院(安徽省人工智能实验室) 一种分布式存储的网内缓存方法、系统以及储存介质

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116991338A (zh) * 2023-09-28 2023-11-03 北京超弦存储器研究院 访问数据的方法及控制器、cxl内存模组和存储系统
CN116991338B (zh) * 2023-09-28 2023-12-22 北京超弦存储器研究院 访问数据的方法及控制器、cxl内存模组和存储系统
CN117614956A (zh) * 2024-01-24 2024-02-27 合肥综合性国家科学中心人工智能研究院(安徽省人工智能实验室) 一种分布式存储的网内缓存方法、系统以及储存介质
CN117614956B (zh) * 2024-01-24 2024-03-29 合肥综合性国家科学中心人工智能研究院(安徽省人工智能实验室) 一种分布式存储的网内缓存方法、系统以及储存介质

Similar Documents

Publication Publication Date Title
CN108810041B (zh) 一种分布式缓存系统的数据写入及扩容方法、装置
US9454533B2 (en) Reducing metadata in a write-anywhere storage system
CN114860163B (zh) 一种存储系统、内存管理方法和管理节点
KR101620773B1 (ko) 복합식 비휘발성 저장 디바이스를 위한 데이터 이송
US9871727B2 (en) Routing lookup method and device and method for constructing B-tree structure
CN116560562A (zh) 一种读、写数据方法及装置
CN107729535B (zh) 一种键值数据库内布隆过滤器的配置方法
US9612975B2 (en) Page cache device and method for efficient mapping
CN107153512B (zh) 一种数据迁移方法和装置
WO2022156650A1 (zh) 访问数据的方法及装置
CN114817195A (zh) 一种分布式存储缓存管理的方法、系统、存储介质及设备
CN110737607B (zh) 管理hmb内存的方法、装置、计算机设备及存储介质
WO2016206070A1 (zh) 一种文件更新方法及存储设备
CN115495433A (zh) 一种分布式存储系统、数据迁移方法及存储装置
CN115794366A (zh) 一种内存预取方法及装置
KR20190112020A (ko) 데이터 처리
CN110121874B (zh) 一种存储器数据替换方法、服务器节点和数据存储系统
JP2018511131A (ja) オンライン媒体のための階層的なコストベースのキャッシング
US11586353B2 (en) Optimized access to high-speed storage device
CN115904211A (zh) 一种存储系统、数据处理方法及相关设备
CN115509437A (zh) 存储系统、网卡、处理器、数据访问方法、装置及系统
CN113590507A (zh) 一种分布式存储系统及其缓存层、数据访问方法、设备
CN113297106A (zh) 基于混合存储的数据置换方法、相关方法及装置和系统
CN117914867B (zh) 一种数据缓冲方法、装置、设备及计算机可读存储介质
WO2024113769A1 (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