用于数据流式计算的内存管理系统及其方法与流程

文档序号:11386295阅读:262来源:国知局
用于数据流式计算的内存管理系统及其方法与流程

本发明的示例性实施例总体说来涉及数据计算领域,更具体地说,涉及一种用于数据流式计算的内存管理系统以及利用所述内存管理系统来管理内存的方法。



背景技术:

随着数据量增多,数据流式计算被广泛应用到各个计算系统当中。一般来说,处理非常大规模数据的算法并不会涉及很复杂的计算操作,不然数据量乘计算量之后是一个无法在常规时间内得到结果的任务。当计算操作并不太复杂时,数据的读写、网络延迟等便会成为数据流式计算的效率瓶颈。

图1示出现有技术中由操作系统在数据流式计算过程中管理内存分配的示例。具体说来,图1所示的系统包括数据流式计算装置200和系统内存管理装置300。这里,数据流式计算装置200用于执行数据流式计算,而系统内存管理装置300可由操作系统中负责内存管理的部分来充当。

具体说来,数据流式计算装置200需要在数据流式计算的开端向系统内存装置300申请内存分配,并在数据流式计算的结尾释放掉相应的内存。

然而,随着各种耗时被不断的优化,数据的读写当中内存申请释放的时间占比变得越来越大,逐渐成为数据流式计算的新效率瓶颈。这个瓶颈出现的原因是在数据流式计算装置200以多线程来执行计算的情况下,系统内存管理装置300仍按照单线程来管理系统内存的申请和释放,而当在多线程下频繁地申请释放内存时,管理系统内存的互斥锁便成为了很大的效率瓶颈。

目前出现了一些技术方案来解决多线程环境下的内存申请和释放问题,例如,公开号为cn104881324a的中国专利申请《一种多线程下的内存管理方法》通过实现一种多线程内存池来避免访问系统内存的单一互斥锁,通过并行的方法实现加速,该方案需要考虑的应用情况较多,实现逻辑复杂,特别是涉及底层的系统逻辑很难保证正确性和通用性。此外,在数据流式计算背景下,即便使用了多线程内存池,在计算框架申请和释放内存时,内存池还是做了实际的内存申请和释放操作,效率方面仍有不足。



技术实现要素:

本发明的示例性实施例旨在克服现有流式计算中内存分配的效率瓶颈问题。

根据本发明的示例性实施例,提供一种用于数据流式计算的内存管理系统,包括:内存回收装置,用于从数据流式计算的结尾回收原本应被释放给操作系统的内存;内存托管装置,用于托管由内存回收装置回收的内存;以及内存分配装置,用于响应于来自数据流式计算的开端的申请,向数据流式计算的开端分配由内存托管装置托管的内存。

可选地,在所述内存管理系统中,内存分配装置在内存托管装置托管的内存之中不存在适于分配的可用内存时,向数据流式计算的开端分配从操作系统申请到的内存或向数据流式计算的开端发送用于指示其直接向操作系统申请内存的指示信号。

可选地,在所述内存管理系统中,内存回收装置通过回收在数据流式计算的结尾得到的对象来回收内存。

可选地,在所述内存管理系统中,内存托管装置包括一个或多个内存池,其中,每个内存池包含一个或多个由针对相同类型的对象的容器组成的容器队列。

可选地,在所述内存管理系统中,每个容器具有一个互斥锁。

可选地,在所述内存管理系统中,每个内存池包括两个容器队列,其中,所述两个容器队列之中的一个容器队列用于回收对象,并且,所述两个容器队列之中的另一容器队列用于分配对象。

可选地,在所述内存管理系统中,每个容器队列具有一个互斥锁。

可选地,在所述内存管理系统中,当所述另一容器队列分配对象失败时,内存托管装置将所述一个容器队列与所述另一容器队列互相交换。

可选地,在所述内存管理系统中,数据流式计算用于机器学习模型训练,对象对应于机器学习模型的样本。

根据本发明的另一示例性实施例,提供一种用于数据流式计算的内存管理方法,包括:(a)从数据流式计算的结尾回收原本应被释放给操作系统的内存;(b)托管所回收的内存;以及(c)响应于来自数据流式计算的开端的申请,向数据流式计算的开端分配所托管的内存。

可选地,所述内存管理方法还包括:(d)在托管的内存之中不存在适于分配的可用内存时,向数据流式计算的开端分配从操作系统申请到的内存或向数据流式计算的开端发送用于指示其直接向操作系统申请内存的指示信号。

可选地,在所述内存管理方法中,在步骤(a)中,通过回收在数据流式计算的结尾得到的对象来回收内存。

可选地,在所述内存管理方法中,在步骤(b)中,通过一个或多个内存池来托管所回收的内存,其中,每个内存池包含一个或多个由针对相同类型的对象的容器组成的容器队列。

可选地,在所述内存管理方法中,每个容器具有一个互斥锁。

可选地,在所述内存管理方法中,每个内存池包括两个容器队列,其中,所述两个容器队列之中的一个容器队列用于回收对象,并且,所述两个容器队列之中的另一容器队列用于分配对象。

可选地,在所述内存管理方法中,每个容器队列具有一个互斥锁。

可选地,在所述内存管理方法中,在步骤(c)中,当所述另一容器队列分配对象失败时,将所述一个容器队列与所述另一容器队列互相交换。

可选地,在所述内存管理方法中,数据流式计算用于机器学习模型训练,对象对应于机器学习模型的样本。

根据本发明的另一示例性实施例,提供一种用于数据流式计算的内存管理的计算装置,其中,所述计算装置包括存储部件和处理器,存储部件中存储有计算机可执行指令集合,当所述计算机可执行指令集合被所述处理器执行时,执行根据本发明示例性实施例的上述方法。

在根据本发明示例性实施例的内存管理系统及其内存管理方法中,独立于操作系统设置了针对数据流式计算的内存分配回收机制,不仅克服了实际向操作系统申请内存的效率问题,而且保留了数据流式计算部分的相对独立性。同时,上述方案在易实现性和稳定性方面也具有突出的优势,能够满足数据流式计算的性能要求。

附图说明

从下面结合附图对本发明实施例的详细描述中,本发明的这些和/或其他方面和优点将变得更加清楚并更容易理解,其中:

图1示出现有技术中由操作系统在数据流式计算过程中管理内存分配的示例;

图2示出根据本发明示例性实施例的包括内存管理系统的计算系统的示例;

图3示出根据本发明示例性实施例的内存管理系统的结构的框图;

图4示出根据本发明示例性实施例的内存管理方法的流程图;

图5示出根据本发明示例性实施例的内存分配步骤的流程图;

图6示出根据本发明另一示例性实施例的内存分配步骤的流程图;

图7示出根据本发明示例性实施例的内存托管装置中的内存池的示例;以及

图8示出根据本发明另一示例性实施例的内存托管装置中的内存池的示例。

具体实施方式

为了使本领域技术人员更好地理解本发明,下面结合附图和具体实施方式对本发明的示例性实施例作进一步详细说明。

数据流式计算要求计算系统可以接受大量的、不间断的数据,相应地,不再进行流式数据的存储,而是当流动的数据到来后在内存中直接进行数据的实时计算。

本发明的示例性实施例涉及一种用于数据流式计算的内存管理系统,作为示例,该内存管理系统可置于操作系统之上层,用于针对数据流式计算进行内存的分配与回收。

图2示出根据本发明示例性实施例的包括内存管理系统的计算系统的示例。参照图2,除了数据流式计算装置200和系统内存管理装置300之外,所述计算系统还包括内存管理系统100。

这里,所述数据流式计算装置200用于针对流式数据执行处理。具体说来,数据流式计算装置200用于接收数据流,并利用申请到的内存来执行相应数据流的处理。对于数据流式计算而言,其可被简化为开端、过程和结尾三个阶段,作为示例,在每个阶段,均可利用一个或多个线程并行地执行数据运算。应注意,这三个阶段之间可以有复杂的数据流向而不限于一个单向管道,但从开端到结尾的数据流图一定是无环的。

如上所述,在数据流式计算的开端部分,需要完成内存的申请以存放相应的数据,而在数据流式计算的结尾部分,将不再需要继续占据上述内存。

不同于图1所示的示例,在根据本发明的示例性实施例的计算系统中,主要由内存管理系统100与数据流式计算装置200就内存的使用进行交互,从而在数据流式计算完成之后回收内存以提供给后续的数据流重复使用。也就是说,在图2所示的计算系统中,不需要每次执行数据流式计算都向操作系统中的系统内存管理装置300申请和释放内存,而是仅当内存管理系统100无法分配合适的内存时,才由内存管理系统100或数据流式计算装置200向系统内存管理装置300实际申请内存。

图3示出根据本发明示例性实施例的内存管理系统的结构的框图,其中,内存管理系统可包括内存回收装置110、内存托管装置120和内存分配装置130。图4示出根据本发明示例性实施例的内存管理方法的流程图。这里,为了描述方便,假设图4所示的方法由图3所示的内存管理系统来执行。此外,在图4的流程图中,还额外示出了数据流式计算的阶段示意图,以用于更清楚地解释根据本发明示例性实施例进行内存管理的示例。

参照图3和图4,在步骤s110中,由内存回收装置110从数据流式计算的结尾回收原本应被释放给操作系统的内存。这里,数据流式计算装置200在针对接收的数据执行完数据流式计算之后,并不会直接向操作系统实际释放之前申请的内存,而是通过适当的方式将所述内存提供给内存回收装置110,以便针对后续数据直接使用回收的内存。作为示例,内存回收装置110可通过任何适当的方式回收数据流式计算的结尾处的相应内存,例如,内存回收装置100可直接回收内存的地址区段;或者,内存回收装置110可通过回收已经被分配相应内存的数据类型来回收内存,例如,内存回收装置110可通过回收在数据流式计算的结尾得到的对象来回收内存,在这种情况下,数据流式计算装置200可将执行完计算处理后的相应对象直接提供给内存回收装置110。

在步骤s120中,由内存托管装置120托管由内存回收装置110回收的内存。具体说来,内存回收装置110可将在数据流式计算的结尾回收的一段或多段内存交由内存托管装置120来托管,这里,所述内存既可以表现为特定的地址区段,也可以表现为占据相应地址区段的数据类型(例如,对象)。作为示例,内存托管装置120可经由内存池来管理回收的内存,这里,内存池中可按照一定规则放置回收的内存。此外,在借由被分配了内存的数据类型来托管内存的情况下,可在内存托管装置120中设置多个容器(container),用于容纳诸如对象的数据类型。这里,可针对每种数据类型设置相应的容器队列,每个容器队列由多个容器组成,从而可由多个线程来并行地访问多个容器,以提高整体处理速度。作为示例,内存托管装置120可包括一个或多个内存池,其中,每个内存池可包含一个或多个由针对相同类型的对象的容器组成的容器队列。这里,可针对容器或容器队列来设置互斥锁,从而提高针对回收内存的访问效率。

在步骤s130中,由内存分配装置130响应于来自数据流式计算的开端的申请,向数据流式计算的开端分配由内存托管装置120托管的内存。具体说来,根据本发明的示例性实施例,当数据流式计算装置200想要为即将处理的数据申请内存时,其可将相应的请求发送至内存分配装置130。内存分配装置130在接收到这样的请求时,可根据当前托管的内存情况向数据流式计算装置120分配适当的内存。作为示例,内存分配装置130可根据待处理数据所占空间、数据类型、内存空间情况、内存占用情况等,将托管的内存中的适合内存分配给数据流式计算装置200。例如,当数据流式计算装置200针对即将处理的特定类型的数据申请内存时,内存分配装置130可将内存托管装置120中与所述特定类型相应的对象提供给数据流式计算装置200。相应地,数据流式计算装置200可直接将该对象的内存用于处理所述数据。也就是说,根据本发明的示例性实施例,可直接将回收的对象用于后续的同类型数据的处理,而不需要执行实际的内存申请和释放操作。

可选地,根据本发明的示例性实施例,除了由内存管理系统100直接负责向数据流式计算装置200分配内存之外,还可在某些情况下借助操作系统来进行内存的分配。例如,内存分配装置130可在内存托管装置120为空时,向数据流式计算的开端分配从操作系统申请到的内存或向数据流式计算的开端发送用于指示其直接向操作系统申请内存的指示信号。

图5示出根据本发明示例性实施例的内存分配步骤的流程图。为了描述方便,假设图5所示的步骤由图3所示的内存管理系统来执行。

参照图5,在步骤s310中,由内存分配装置130从数据流式计算装置200接收到对内存的申请。这里,数据流式计算装置200可针对即将处理的数据来申请必要的内存,为此,数据流式计算装置200可在申请信息中携带关于所需内存规格的信息。作为示例,数据流式计算装置200可在申请信息中携带关于所需内存大小等信息。这里,数据流式计算装置200可按照与内存管理系统100之间的约定,以预先设置的信息格式来发送内存申请信息。

接着,在步骤s320中,由内存分配装置130确定内存托管装置120中是否存在适于分配给数据流式计算装置200的可用内存。这里,内存分配装置130可通过查看数据流式计算装置200发出的申请信息来搜索托管内存中符合要求的可用内存,在此过程中,作为可选方式,内存分配装置130在确定可用内存时还需进一步符合其他要求,例如,在数据流式计算的多个线程同时申请内存的情况下,可用内存还需满足预先设置的分配规则,例如,内存与线程之间的对应性等。可选地,内存分配装置130可将是否成功找到可用内存的结果信息返回数据流式计算装置200。

如果内存分配装置130在步骤s320确定存在适于分配的可用内存,则在步骤s330,由内存分配装置130将所述可用内存提供给数据流式计算装置200以执行相应的运算操作。这里,内存的提供可直接表现为相应地址区段的提供;此外,内存的提供还可借助占据相应地址区段的数据类型(例如,对象)来完成,例如,内存分配装置130可将已经被分配了内存的对象提供给数据流式计算装置200,使得数据流式计算装置200可将待处理数据置于相应的内存空间,以替换原来的数据。由此可见,根据本发明的示例性实施例,可经由内存的回收机制来直接将已处理数据的内存应用于后续的待处理数据,避免了实际的内存申请和释放操作,提高了系统整体速度。

此外,如果内存分配装置130在步骤s320确定不存在适于分配的可用内存,则在步骤s340,由内存分配装置130向操作系统申请可用内存。例如,内存分配装置130可基于先前从数据流式计算装置200接收的内存申请信息来获取期望申请的内存规格,并由此形成相应的系统内存申请以提供给系统内存管理装置300。系统内存管理装置300在接收到来自内存分配装置130的系统内存申请之后,可将相应的内存提供给内存分配装置130。

接下来,在步骤s350,由内存分配装置130将从操作系统申请到的内存提供给数据流式计算装置200。

图6示出根据本发明另一示例性实施例的内存分配步骤的流程图。同样地,为了描述方便,假设图6所示的步骤由图3所示的内存管理系统来执行。

参照图6,在步骤s310中,由内存分配装置130从数据流式计算装置200接收到对内存的申请。接着,在步骤s320中,由内存分配装置130确定内存托管装置120中是否存在适于分配给数据流式计算装置200的可用内存。如果内存分配装置130在步骤s320确定存在适于分配的可用内存,则在步骤s330,由内存分配装置130将所述可用内存提供给数据流式计算装置200以执行相应的运算操作。上述步骤与图5中示出的对应步骤一致,因此将省略对它们的细节描述。

此外,如果内存分配装置130在步骤s320确定不存在适于分配的可用内存,则在步骤s341,由内存分配装置130指示数据流式计算装置200向操作系统申请可用内存。相应地,数据流式计算装置200在内存分配装置130的指示下改为直接向操作系统申请所需要的内存空间。

图7示出根据本发明示例性实施例的内存托管装置中的内存池的示例。内存管理装置100中可包括如图7所示的内存池,具体说来,该内存池可位于内存托管装置120中,用于容纳从数据流式计算的结尾回收的内存。作为示例,内存池可包含由容器组成的容器队列。这里,各个容器是可以并行访问的,而每个容器可容纳一个或多个对象,由此可满足数据流式计算中的多个线程需要同时申请内存或同时提供回收内存的情况。

尽管在图7中仅示出一个内存池,且该内存池仅包含一个容器队列,然而,本领域技术人员应理解:本发明的示例性实施例并不受限于此,而是可根据需要采用任意数量的内存池,且每个内存池中也可以包含任意数量的容器队列。例如,可针对数据流式计算的具体情况而设置一个或多个内存池,每个内存池针对特定类型的数据,相应地,其中的容器可存放所述特定类型的对象。此外,可针对每个容器分配一个相应的互斥锁,使得多个线程在执行内存的申请和回收时能够避免产生冲突。具体说来,在得到数据流式计算的结尾的内存之后,可按照一定策略选择某个容器,得到对应的互斥锁之后将内存放入该容器内;而当数据流式计算的开端申请内存时,可按照一定策略选择某个容器,得到对应的互斥锁之后取出该容器中的内存。

举例说来,根据本发明示例性实施例的数据流式计算可用于机器学习模型训练,相应地,对象可对应于机器学习模型的样本。在这种情况下,由于整个数据流式计算主要处理训练样本数据,也就是说,绝大多数的内存申请和回收是针对流内数据的,因此,可在容器存放固定类型(即,流内数据类型)的对象,通过这种方式,可明显降低编程的逻辑复杂度,提高实用性。

例如,可在内存托管装置120中设置单个内存池,该内存池包括一个由针对相同类型(即,训练样本)的对象的容器组成的容器队列。所述对象在流式计算的过程中如果发生空间不足的情况,则可由数据流式计算装置200直接进行内存扩展,从而不必拘泥于由内存分配装置130分配的内存。例如在c++的编程环境下,每一个容器(container)都是一个std::vector<std::string>,内存回收装置110在数据流式计算的结尾回收的是std::string类型的对象,而数据流式计算的开端所申请到的也是std::string类型的对象。当开端申请到的std::string的内存大小在后续操作中不够用时,数据流式计算装置200可直接依赖std::string的原始申请或扩展方式,而不必再向内存分配装置130进行内存申请。

在很多情况下,上述方式是不需要多次调用系统的内存申请的,可以大大降低内存申请开销,同时内存的释放大小仅为同一时间系统中存在的数据总量而非原始数据的总大小,大大减少了内存释放的时间。

图8示出根据本发明另一示例性实施例的内存托管装置中的内存池的示例。这里,为了描述方便,仅在图8中示出单个内存池,然而,应理解,本发明的示例性实施例并非受限于此,而是可根据需要设置任何数量的内存池,例如,可针对每种类型的数据设置一个相应的内存池。

参照图8,每个内存池可包括两个容器队列,其中,所述两个容器队列之中的一个容器队列(以下称为“回收容器队列”)用于回收对象,并且,所述两个容器队列之中的另一容器队列(以下称为“申请容器队列”)用于分配对象。

具体说来,数据流式计算的开端可专门向申请容器队列申请内存以用于数据的流式计算,为此,在数据流式计算装置200开始针对接收的数据执行计算时,其首先将申请信息发送至内存申请装置130,以便于在内存托管装置120中查看内存池的申请容器队列中是否存在符合需求的可用内存,并将符合需求的可用内存(例如,通过容器中的对象)提供给数据流式计算装置200。相应地,内存回收装置110将在数据流式计算的结尾回收的对象专门存放于回收容器队列的容器中。

这里,可将容器队列中的容器数量设置为等于或大于能够同时进行内存申请/回收的线程数量,这样,可容易地实现多个线程的同时操作而不必针对每一个容器来设置相应的互斥锁。此外,当申请容器队列分配对象失败时,内存托管装置120可将回收容器队列与申请容器队列互相交换。为此,每个容器队列可具有一个互斥锁,即,申请容器队列和回收容器队列可分别具有各自的互斥锁,这样,当申请容器队列为空或者某线程对应的申请容器为空时,可基于两个容器队列各自的互斥锁状态来实现两个容器队列的互换,方便回收的内存被继续分配给后续的数据流式处理。通过这种方式,仅互换容器队列操作需要访问互斥锁,而全局也仅需两个互斥锁,大大减少了锁的访问开销与等待时间。

应注意,根据本发明示例性实施例的内存管理系统可完全依赖计算机程序的运行来实现相应的功能,即,各个装置与计算机程序的功能架构中与各步骤相应,使得整个系统通过专门的软件包(例如,lib库)而被调用,以实现相应的功能。

另一方面,根据本发明示例性实施例的内存管理系统中的装置可被分别配置为执行特定功能的软件、硬件、固件或上述项的任意组合。例如,这些装置可对应于专用的集成电路,也可对应于纯粹的软件代码,还可对应于软件与硬件相结合的单元或模块。当所述装置以软件、固件、中间件或微代码实现时,用于执行相应操作的程序代码或者代码段可以存储在诸如存储介质的计算机可读介质中,使得处理器可通过读取并运行相应的程序代码或者代码段来执行相应的操作。此外,这些装置所实现的一个或多个功能也可由物理实体设备(例如,处理器、客户端或服务器等)中的组件来统一执行。

这里,本发明的示例性实施例可以实现为用于内存管理的计算装置,该计算装置包括存储部件和处理器,存储部件中存储有计算机可执行指令集合,当所述计算机可执行指令集合被所述处理器执行时,执行根据本发明示例性实施例的内存管理方法。具体说来,当所述计算机可执行指令集合被所述处理器执行时,所述处理器执行下述步骤:(a)从数据流式计算的结尾回收原本应被释放给操作系统的内存;(b)托管回收的内存;以及(c)响应于来自数据流式计算的开端的申请,向数据流式计算的开端分配托管的内存。

具体说来,所述计算装置可以部署在服务器或客户端中,也可以部署在分布式网络环境中的节点装置上。此外,所述计算装置可以是pc计算机、平板装置、个人数字助理、智能手机、web应用或其他能够执行上述指令集合的装置。这里,所述计算装置并非必须是单个的计算装置,还可以是任何能够单独或联合执行上述指令(或指令集)的装置或电路的集合体。计算装置还可以是集成控制系统或系统管理器的一部分,或者可被配置为与本地或远程(例如,经由无线传输)以接口互联的便携式电子装置。

在所述计算装置中,处理器可包括中央处理器(cpu)、图形处理器(gpu)、可编程逻辑装置、专用处理器系统、微控制器或微处理器。作为示例而非限制,处理器还可包括模拟处理器、数字处理器、微处理器、多核处理器、处理器阵列、网络处理器等。处理器可运行存储在存储部件之一中的指令或代码,其中,所述存储部件还可以存储数据。指令和数据还可经由网络接口装置而通过网络被发送和接收,其中,所述网络接口装置可采用任何已知的传输协议。

存储部件可与处理器集成为一体,例如,将ram或闪存布置在集成电路微处理器等之内。此外,存储部件可包括独立的装置,诸如,外部盘驱动、存储阵列或任何数据库系统可使用的其他存储装置。存储部件和处理器可在操作上进行耦合,或者可例如通过i/o端口、网络连接等互相通信,使得处理器能够读取存储在存储部件中的文件。

此外,所述计算装置还可包括视频显示器(诸如,液晶显示器)和用户交互接口(诸如,键盘、鼠标、触摸输入装置等)。计算装置的所有组件可经由总线和/或网络而彼此连接。

应注意,以上已经结合图4到图7描述了根据本发明示例性实施例的内存管理方法的各处理细节,这里将不再赘述计算装置执行各步骤时的处理细节。

以上已经描述了本发明的各示例性实施例,应理解,上述描述仅是示例性的,并非穷尽性的,并且本发明也不限于所披露的各示例性实施例。在不偏离本发明的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。因此,本发明的保护范围应该以权利要求的范围为准。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1