CN109189577A - 一种数据同步时防止内存溢出的方法和装置 - Google Patents

一种数据同步时防止内存溢出的方法和装置 Download PDF

Info

Publication number
CN109189577A
CN109189577A CN201811010996.9A CN201811010996A CN109189577A CN 109189577 A CN109189577 A CN 109189577A CN 201811010996 A CN201811010996 A CN 201811010996A CN 109189577 A CN109189577 A CN 109189577A
Authority
CN
China
Prior art keywords
data
message queue
memory
big field
caching
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.)
Granted
Application number
CN201811010996.9A
Other languages
English (en)
Other versions
CN109189577B (zh
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.)
Wuhan Dream Database Co ltd
Original Assignee
Wuhan Dameng Database 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 Wuhan Dameng Database Co Ltd filed Critical Wuhan Dameng Database Co Ltd
Priority to CN201811010996.9A priority Critical patent/CN109189577B/zh
Publication of CN109189577A publication Critical patent/CN109189577A/zh
Application granted granted Critical
Publication of CN109189577B publication Critical patent/CN109189577B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5011Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
    • G06F9/5016Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/14Error detection or correction of the data by redundancy in operation
    • G06F11/1402Saving, restoring, recovering or retrying
    • G06F11/1446Point-in-time backing up or restoration of persistent data
    • G06F11/1458Management of the backup or restore process
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5011Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
    • G06F9/5022Mechanisms to release resources
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/546Message passing systems or structures, e.g. queues
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2209/00Indexing scheme relating to G06F9/00
    • G06F2209/54Indexing scheme relating to G06F9/54
    • G06F2209/548Queue

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Quality & Reliability (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明涉及数据同步技术领域,具体涉及一种数据同步时防止内存溢出的方法和装置,其中方法包括:从源端读取数据,根据消息队列中已缓存数据量判断是否触发外缓存,如果触发则对数据进行大字段外缓存处理,再将数据缓存到消息队列,如果不触发则直接将数据缓存到消息队列;当下游组件需要时从消息队列中取出数据,若取出的数据有大字段外缓存,则从外缓存中进行数据恢复;将数据装载至目的端,完成数据同步。本发明将数据中占用内存过多的大字段放到外存中缓存,在数据需要清洗转换或装载时再进行数据恢复,避免同步服务器内部缓存大量数据,使数据读取组件尽可能保持工作而不是暂停,提高同步服务器同步数据的性能以及工作稳定性。

Description

一种数据同步时防止内存溢出的方法和装置
【技术领域】
本发明涉及数据同步技术领域,具体涉及一种数据同步时防止内存溢出的方法和装置。
【背景技术】
通常来讲,数据同步的基本步骤可以抽象为三个相互关联的部分:一是数据读取组件从源端的数据源读取数据到同步服务器,二是数据缓存到同步服务器的消息队列,三是数据装载组件从消息队列将数据取出,并写到目的端数据源,具体如图1所示。其中,消息队列为同步服务器内部用于缓存数据读取组件抽取的数据的队列;在第一个步骤中,可能还需要对抽取来的数据进行解析,构造成结构化数据;而在第三个步骤中,数据在装载到目的端数据源之前可能还需要数据转换组件(图中未示出)对数据做一定转换清洗工作,清洗转换完成后,数据装载组件再将数据装到目的数据源处。如果上述三个步骤协调的好,数据读取组件的速度和数据装载组件的速度匹配,则同步过程可满负荷进行,且不会占用同步服务器太多的内存用于缓存数据。
为此引入缓存数据量大小,若缓存数据量极小几乎为零,则说明数据装载组件的处理速度远快于数据读取组件;若缓存数据量较小,说明数据读取组件和数据装载组件配合的很好,处理速度相当;若缓存数据量大,则说明数据装载组件的速度跟不上数据读取组件的处理速度。因此,缓存数据量的大小能够反应出数据同步的瓶颈。在上述数据同步过程中,如果数据装载组件向目的端数据源装载过程中出现性能问题,如典型的数据装载过程使用的网络突然拥塞,则同步服务器内部将缓存大量数据,特别是存在大字段的情况下,单个同步任务占用大量内存,直接影响到其它工作线程对内存的需求,数据同步服务器的整体性能也会出现严重降低,甚至发生内存溢出导致系统崩溃。
目前常用的做法是限制消息队列的大小:当消息队列填满后,数据读取组件试图向消息队列继续添加数据时,数据读取线程被阻塞,直到数据装载组件从消息队列中消耗了一条数据后,数据读取线程才继续工作,通过这种机制控制同步过度消耗服务器内存。
然而,数据读取组件从源端数据源抽取数据到同步服务器的这一过程是需要耗时的,因消息队列已满而暂停这一过程肯定会使整个同步的性能受到影响。而且,消息队列的长度一般通过同步服务器能使用的最大内存量、同步服务器启动所需内存、工作线程数、机动内存、以及源端数据源处根据数据字段的类型估算一条数据的大小等信息计算而得,而根据数据的字段类型估算字段的大小是一种不精确方法,可能会导致工作线程实际使用内存超过初始化分配其可用的大小,小概率的情况下发生内存溢出,进而导致系统崩溃,影响同步服务器工作的稳定性。
鉴于此,克服上述现有技术所存在的缺陷是本技术领域亟待解决的问题。
【发明内容】
本发明需要解决的技术问题是:
在数据同步过程中,因外部原因容易导致同步服务器内部缓存大量数据,目前通常是在消息队列填满后暂停数据读取,使整个同步的性能受到影响,而且数据估算不精确,小概率发生内存溢出导致系统崩溃,影响同步服务器工作的稳定性。
本发明通过如下技术方案达到上述目的:
第一方面,本发明提供了一种数据同步时防止内存溢出的方法,包括:
从源端读取数据,根据消息队列中的已缓存数据量判断是否触发大字段外缓存,如果触发则对所述数据进行大字段外缓存处理;
将经外缓存处理后的数据缓存到消息队列中,并更新消息队列中的已缓存数据量;
从消息队列中取出数据并更新已缓存数据量,若取出的数据有大字段外缓存,则从外缓存中进行数据恢复;
将从消息队列取出的数据或经数据恢复后的数据装载至目的端,完成数据同步。
优选的,所述根据消息队列中的已缓存数据量判断是否触发大字段外缓存,如果触发则对所述数据进行大字段外缓存处理,具体包括:
计算从源端读取数据的数据字节大小;
计算消息队列中的已缓存数据量与所述数据字节大小的和值,并与第一内存阈值比较;
如果所述和值大小超过所述第一内存阈值,则对所述数据进行大字段外缓存处理。
优选的,对所述数据进行大字段外缓存处理的过程具体为:将所述数据中的大字段用临时文件元数据代替,并更新所述数据字节大小;将大字段和临时文件元数据进行提交,进而根据临时文件元数据将数据大字段的内容写到外存中的临时文件。
优选的,对有大字段外缓存的数据,从外缓存中进行数据恢复的过程具体为:根据所述数据对应的临时文件元数据结构,从所述临时文件中读入所述数据对应的大字段内容,进而完成数据恢复。
优选的,用于代替大字段的临时文件元数据包括临时文件名、大字段在临时文件中的起始位置以及大字段的长度。
优选的,所述方法还包括:将当前消息队列中的已缓存数据量与第二内存阈值比较;如果所述已缓存数据量超过所述第二内存阈值,则将所述消息队列中预设比例的数据进行大字段外缓存处理。
优选的,在所述从消息队列中取出数据之前,所述方法还包括:将所述消息队列中的数据按照经外缓存处理和未经外缓存处理进行分组,且所述未经外缓存处理的数据顺序靠前,所述经外缓存处理的数据顺序靠后,使得所述未经外缓存处理的数据先从消息队列中被取出。
优选的,如果当前从源端读取的数据需要进行大字段外缓存处理,则提交外缓存请求,同时直接从源端读取下一条数据,无需等待外缓存处理完成;
如果当前从消息队列中获取的数据需要进行数据恢复处理,则提交数据恢复请求,同时直接从所述消息队列中获取下一条数据,无需等待数据恢复完成。
第二方面,本发明还提供了一种数据同步时防止内存溢出的装置,用于实现上述第一方面所述的数据同步时防止内存溢出的方法,所述装置包括数据读取组件1、内外缓存交换模块2、数据装载组件3以及公共I/O服务模块4,其中,所述数据读取组件1用于从源端读取数据,使数据进入所述内外缓存交换模块2;
所述内外缓存交换模块2用于实时更新缓存数据量,并判断是否需要对数据进行大字段外缓存处理,最后将数据添加到消息队列;同时,所述内外缓存交换模块2还用于从消息队列中获取数据,根据数据是否有大字段外缓存来决定是否进行数据恢复处理;
所述公共I/O服务模块4用于将数据的大字段内容写到外存的临时文件中,完成大字段外缓存处理;以及从所述临时文件中读取数据的大字段内容,完成恢复数据;
所述数据装载组件3用于将从所述内外缓存交换模块2获取的数据装载至目的端,进而完成数据同步。
第三方面,本发明还提供了另一种数据同步时防止内存溢出的装置,用于实现上述第一方面所述的数据同步时防止内存溢出的方法,所述装置包括至少一个处理器和存储器,所述至少一个处理器和存储器之间通过数据总线连接,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令在被所述处理器执行后,用于完成权利要求1-8任一所述的数据同步时防止内存溢出的方法。
本发明的有益效果是:
本发明提供的数据同步时防止内存溢出的方法和装置中,可将数据中占用内存过多的大字段内容暂时放到本地外存中缓存,在数据需要清洗转换或装载时再进行数据恢复,该方法可释放内存,避免了同步服务器内部缓存大量数据,保证其它数据同步工作线程能申请到所需内存,使数据读取组件尽可能地保持工作而不是做简单的暂停,提高了同步服务器同步数据的性能,同时也提高了同步服务器工作的稳定性。
【附图说明】
为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例中所需要使用的附图作简单地介绍。显而易见地,下面所描述的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为现有的一种数据同步过程中的数据流示意图;
图2为本发明实施例提供的一种数据同步时防止内存溢出的方法流程图;
图3为本发明实施例提供的一种数据同步时防止内存溢出的方法中的数据流示意图;
图4为图2中步骤10具体实现的工作流程图;
图5为本发明实施例提供的大字段缓存到临时文件中的元数据结构;
图6为图2中步骤30具体实现的工作流程图;
图7为本发明实施例提供的一种数据同步时防止内存溢出的装置架构图。
【具体实施方式】
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。下面就参考附图和实施例结合来详细说明本发明。
实施例1:
本发明实施例提供了一种数据同步时防止内存溢出的方法,在图1的基础上增加了“内外缓存交换模块”和“公共I/O服务模块”,进而调整数据读取组件向消息队列添加数据和数据装载组件从消息队列获取数据的流程。如图2所示,具体包括以下步骤:
步骤10,从源端读取数据,根据消息队列中的已缓存数据量判断是否触发大字段外缓存,如果触发则对所述数据进行大字段外缓存处理。
参考图3,由数据读取组件从源端数据源读取数据到同步服务器,不同于传统方法中直接将数据缓存到消息队列中,此处数据读取组件先将数据放入内外缓存交换模块处,进而调用内外缓存交换模块的相关功能。所述内外缓存交换模块可实时更新当前消息队列中的已缓存数据量,进而判断是否需要对数据进行大字段外缓存处理;如果需要,则向公共I/O服务模块提交外缓存请求,通过公共I/O服务模块完成大字段外缓存;如果不需要,则无需处理。其中,大字段是指数据中字段(或列)值占用空间比较大的字段,如关系数据库中的CLOB/BLOB/TEXT/IMG等,记为lob。通过及时将占用内存过多的大字段缓存到外存,释放了同步服务器的内存,保证其它数据同步工作线程能申请到所需内存,提高同步服务器工作的稳定性和整体同步性能。
步骤20,将经外缓存处理后的数据缓存到消息队列中,并更新消息队列中的已缓存数据量。如果在步骤10中从源端读取的数据无需进行大字段外缓存,则内外缓存交换模块直接将获从源端读取的数据添加到消息队列;如果在步骤10中从源端读取的数据需要进行大字段外缓存,则内外缓存交换模块将经外缓存处理后的数据缓存到消息队列中。此时消息队列中新缓存入一条数据,则及时更新所述已缓存数据量。
步骤30,从消息队列中取出数据并更新已缓存数据量,若取出的数据有大字段外缓存,则从外缓存中进行数据恢复。继续参考图3,不同于传统方法中数据装载组件直接从消息队列将数据取出并写到目的端数据源,此处先由所述内外缓存交换模块从消息队列中获取数据,进而判断所述数据是否有大字段外缓存。如果有,则内外缓存交换模块向公共I/O服务模块提交数据恢复请求,通过公共I/O服务模块从外存中完成数据恢复;如果没有,则无需恢复处理。此时消息队列中数据减少,及时更新所述已缓存数据量。
步骤40,将从消息队列取出的数据或经数据恢复后的数据装载至目的端,完成数据同步。如果在步骤30中从消息队列取出的数据无需进行数据恢复,则内外缓存交换模块直接将从消息队列取出的数据传给数据装载组件;如果在步骤30中从消息队列取出的数据需要进行数据恢复,则内外缓存交换模块将恢复后的数据传给数据装载组件;再由所述数据装载组件将数据装载至目的端数据源,或者对数据做一定转换清晰工作后将数据装载至目的端数据源,进而完成整个数据同步的过程。传统方法中数据装载组件因外部原因可能会导致处理速度跟不上,同步服务器内部缓存大量数据,数据读取组件被阻塞,通过实时更新缓存数据量然后外存大字段可解决这一问题,进而提高同步性能。更具体地讲,数据同步软件通过数据读取组件将数据从源端数据源处读到ETL内部时,可能需要对数据做一定的清洗转换工作,如对大字段的值进行加密、压缩、替换某些内容的值或转换格式(如jpg转png)等,清洗转换是由数据转换组件(图中未示出)完成的。那么,数据读取组件触发外缓存后,数据转换组件和数据装载组件都可能触发从外存中恢复数据,所以外缓存的数据恢复的时机可能是数据转换组件运行时,也可能是在数据装载组件运行时。如果外缓存的大字段内容需要进行清洗转换,则数据转换组件运行时进行数据恢复,在数据清洗转换完成后再由数据装载组件装载到目的端数据源处。
本发明提供的数据同步时防止内存溢出的方法中,可将数据中占用内存过多的大字段内容暂时放到本地外存中缓存,在数据需要清洗转换或装载时再进行数据恢复,该方法可释放内存,避免了同步服务器内部缓存大量数据,保证其它数据同步工作线程能申请到所需内存,使数据读取组件尽可能地保持工作而不是做简单的暂停,提高了同步服务器同步数据的性能,同时也提高了同步服务器工作的稳定性。
在本发明实施例中,所述内外缓存交换模块主要提供两个功能接口:put()和take();通过put()方法,所述内外缓存交换模块可实现所述步骤10和步骤20的功能:根据消息队列中的已缓存数据量判断是否触发大字段外缓存,如果触发则对所述数据进行大字段外缓存处理;将从源端读取的数据或经外缓存处理后的数据缓存到消息队列中,并更新消息队列中的已缓存数据量。通过take()方法,所述内外缓存交换模块可实现所述步骤30的功能:从消息队列中取出数据并更新已缓存数据量,若取出的数据有大字段外缓存,则从外缓存中进行数据恢复。
参考图4,所述步骤10的实现具体包括以下步骤:
步骤101,计算从源端读取数据的数据字节大小。此处将当前读取数据的数据字节大小记为dataSize,数据读取组件将当前从源端读取的数据放入内外缓存交换模块后,内外缓存交换模块即可计算dataSize。此处可在内外缓存交换模块内设置触发标记flag,0代表不外缓存大字段,1代表外缓存大字段,2代表数据读取线程被阻塞,将flag初始值设为0。每次进行数据同步时,flag都有可能会被重置,则在每次执行步骤101之前,可先判断flag是否为2,若flag=2,证明数据读取线程被阻塞,则等待数据读取组件唤醒;或者休眠一段时间后再检测flag的状态,进而决定下一步操作。
步骤102,计算消息队列中的已缓存数据量与所述数据字节大小的和值,并与第一内存阈值比较。此处以currentCacheSize表示消息队列中当前的已缓存数据量,初始化为0;以maxCacheSize表示消息队列中的最大可缓存数据量,根据同步服务器最大允许使用内存、保留内存和工作线程数计算得到;以threshold.1表示第一内存阈值,以present.1表示第一触发阈值比例,则threshold.1=maxCacheSize*present.1;present.1由用户根据不同的需求进行配置,优选地设置为50%以上,比如80%或90%,以便为消息队列预留一定的缓存空间;还可设为100%,此时threshold.1=maxCacheSize。
步骤103,如果所述和值大小超过所述第一内存阈值,则对所述数据进行大字段外缓存处理;否则所述数据无需进行外缓存处理。在该步骤中,如果currentCacheSize+dataSize>=threshold.1,证明若将当前所述数据直接添加到消息队列中,消息队列中的缓存量将会超过第一内存阈值;尤其当threshold.1=maxCacheSize时,将会直接超出最大可用内存,可能导致内存溢出,则此时需将flag置1,使得内外缓存交换模块向公共I/O服务模块提交外缓存请求,进而由公共I/O服务模块对当前数据进行外缓存处理;提交外缓存请求后可将flag重置为0。或者,如果当前flag已经为1,则证明需要进行大字段外缓存,可跳过上述比较过程直接向公共I/O服务模块提交外缓存请求。如果当前的触发标记flag为0且currentCacheSize+dataSize<threshold.1,证明当前消息队列中仍可缓存数据,则无需提交外缓存请求。
其中,通过公共I/O服务模块对数据进行大字段外缓存处理的具体过程如下:将所述数据中的大字段用临时文件元数据代替,并更新所述数据大小dataSize;将大字段和临时文件元数据信息打包成任务提交给公共I/O服务模块,所述公共I/O服务模块再根据临时文件元数据将数据大字段的内容写到本地外存的临时文件中。其中,大字段内存缓存到外存临时文件中的元数据结构如图5所示,此处用于代替大字段的临时文件元数据包括临时文件名、大字段在临时文件中的起始位置以及大字段的长度。
在步骤20中,将数据追加到消息队列尾后,若当前currentCacheSize=0,需先唤醒数据装载组件,再更新currentCacheSize:currentCacheSize=currentCacheSize+dataSize。需要注意的是,如果从源端读取的数据无需进行大字段外缓存,则dataSize为最初在步骤101中计算得到的结果;如果经过大字段外缓存处理,则dataSize为在步骤103中更新后的结果。消息队列中每次新缓存入一条数据,都及时更新已缓存数据量。在该步骤中,为便于下次操作,可再引入一次判断过程:如果更新后的currentCacheSize>=threshold.3,则将flag置为1,则在下次读取数据时,可根据该值直接进行大字段外缓存;如果出现特殊情况下currentCacheSize>=maxCacheSize,将flag置2。其中,threshold.3表示第三内存阈值,略小于threshold.1,比如,threshold.1可设为90%,threshold.3可设为80%。
进一步参考图6,所述步骤30的实现过程具体包括以下步骤:
步骤301,调用内外缓存交换模块从所述消息队列头部取出一条数据,判断所述数据中是否有大字段外缓存。
步骤302,如果有大字段外缓存,则提交数据恢复请求,对所述数据进行还原后得到当前返回数据;如果无大字段外缓存,则直接将所述数据作为当前返回数据。
此处以currentData表示当前返回数据,也就是经内外缓存交换模块后可返回给所述数据装载组件进而装载至目的端的数据。如果当前从消息队列获取的数据有大字段外缓存,内外缓存交换模块向公共I/O服务模块提交数据恢复请求,进而通过公共I/O服务模块对该数据进行恢复,具体如下:将该数据追加到fillingQueue,请求公共I/O服务模块填充还原该数据;所述公共I/O服务模块接收请求后,根据所述数据对应的临时文件元数据结构,即图5所示的数据结构,从所述临时文件中读入所述数据对应的大字段内容填充到该数据中的相应字段,进而完成该数据的恢复还原;最后将恢复的数据追加到filledQueue,作为currentData。其中,fillingQueue为数据请求填充队列,用于存放需要所述公共I/O服务模块填充还原的数据;filledQueue为数据填充完成队列,用于存放所述公共I/O服务模块已填充还原的数据。
步骤303,更新消息队列中的已缓存数据量,返回所述当前返回数据。在上述步骤中,所述消息队列中已经取出一条数据,因此需对currentCacheSize进行及时更新:currentCacheSize=currentCacheSize–dataSize;如果更新后currentCacheSize<threshold.3且此时flag!=0,则将flag置0,避免下次读取数据时提供错误的依据;操作完成后返回currentData。
其中,在执行上述步骤301之前,也就是从消息队列中取出数据之前,还可先判断filledQueue是否为空,若为空,则目前没有可作为currentData的完成恢复还原的数据,因此需要继续向下执行步骤301;若filledQueue不为空,则目前仍有可作为currentData的完成恢复还原的数据,则先将filledQueue中的数据作为currentData,传送给所述数据装载组件,直至filledQueue为空后,再继续向下执行步骤301。若当前currentCacheSize=0,证明数据装载线程被阻塞,则等待数据装载组件唤醒,或休眠一段时间后再重新先判断filledQueue是否为空,并执行相应的操作。
结合本发明实施例,还存在一种优选的实现方案:设置消息队列的第二内存阈值threshold.2,且threshold.1<threshold.2<maxCacheSize。在数据同步的进行过程中,将当前消息队列中的已缓存数据量与第二内存阈值比较;如果所述已缓存数据量超过所述第二内存阈值,则将所述消息队列中预设比例的数据进行大字段外缓存处理。所述预设比例可根据实际需要从0-100%中选取。比如预设比例为50%,假设当前消息队列中缓存有1000条数据,且此时currentCacheSize>=threshold.2,则选取消息队列中1000条数据中的50%,也就是500条数据,如果这500条数据中存在大字段,则将相应数据的大字段进行外缓存处理。其中,在选择时可优先选择消息队列中的后500条数据处理,从而不会影响靠前的数据及时被取出消息队列。相应地,在从消息队列中读取数据时,再对这部分数据进行数据恢复。
结合本发明实施例,还存在一种优选的实现方案:在从消息队列中取出数据之前,将所述消息队列中的数据按照经外缓存处理和未经外缓存处理进行分组,且所述未经外缓存处理的数据顺序靠前,所述经外缓存处理的数据顺序靠后,使得所述未经外缓存处理的数据先从消息队列中被取出。该方案适用于内外缓存交换模块和公共I/O服务模块共用一个处理器的情况。比如,当前消息队列中有d1-d10共10条数据,且d2、d4、d6、d8和d10为经过大字段外缓存处理后的数据,分为A组,d1、d3、d5、d7和d9为未经过大字段外缓存处理后的数据,分为B组,如果按照原顺序的d1-d10的顺序依次从消息队列中向外读取,则处理器从内存中读取d1后需切换到外存读取d2,再切换到内存读取d3,如此一来就需要在内外存之间频繁切换,影响处理效率。因此,将数据按照内外缓存情况进行上述分组,未经处理过的B组排在消息队列前面,处理时先被读取,而经过处理的A组排在后面,当A组的数据条数达到预设值时再进行切换,统一读取A组的数据;比如,A组数据达到10条时,暂停读取B组的数据,切换处理A组数据,处理完成后再切换到B组处理。通过这种分组读取的方式,可避免处理器频繁在内外缓存之间的切换,从而在一定程度上提高了数据同步效率。
结合本发明实施例,还存在一种优选的实现方案:所述公共I/O服务模块是一个独立的服务模块,有自己的执行线程,为数据读取组件和数据装载组件提供内外数据交换服务;将其作为一个独立的模块,是基于并发处理的考虑。在不考虑数据读取顺序以及数据装载顺序的情况下,在所述步骤10中,如果当前从源端读取的数据需要进行大字段外缓存处理,则提交外缓存请求给公共I/O服务模块后,数据读取组件可直接从源端读取下一条数据,而无需等待公共I/O服务模块对当前数据完成大字段外缓存处理;同样地,在所述步骤30中,如果当前从消息队列中获取的数据需要从外存临时文件中进行数据恢复,则提交数据恢复请求给公共I/O服务模块后可直接从所述消息队列中获取下一条数据,而无需等待公共I/O服务模块完成当前数据恢复。如此一来可实现并发处理,进一步提高数据同步的效率。
本发明实施例提供的一种数据同步时防止内存溢出的方法中,主要调整了数据读取组件向消息队列添加数据和数据装载组件从消息队列获取数据的流程:从源端读取的数据在进入消息队列前先经内外缓存交换模块,数据中占用内存过多的大字段可通过公共I/O服务模块写到外存临时文件;从消息队列中获取的数据在进入数据装载组件之前也需先经过内外缓存交换模块,对于之前经过外缓存的数据可通过公共I/O服务模块从外存临时文件中恢复。由于大字段是最耗内存的,本发明将大字段放到外存中缓存,而只将大字段外部缓存是考虑到如果将所有字段外部缓存会增加临时文件中文件格式的复杂性和增加过多的描述性元数据,数据恢复重构时也会增加解析难度和时间。数据读取组件从源端数据源处抽取数据的耗时一般会超过直接从本地磁盘文件读取数据的耗时,因此将部分大字段缓存到本地外存能够提高同步服务器同步数据的性能,同时释放了缓存大字段的内存进而能提高同步服务器工作的稳定性。
实施例2:
在上述实施例1的基础上,本发明还提供了一种数据同步时防止内存溢出的装置,用于实现实施例1所述的数据同步时防止内存溢出的方法,参考图3,所述装置包括数据读取组件1、内外缓存交换模块2、数据装载组件3以及公共I/O服务模块4,结合实施例1中所述方法,本发明实施例中在传统方案的基础上增加了“内外缓存交换模块”和“公共I/O服务模块”,进而调整了数据读取组件向消息队列添加数据和数据装载组件从消息队列获取数据的流程。
其中,所述数据读取组件1用于从源端数据源读取数据到同步服务器,使数据进入所述内外缓存交换模块2。
所述内外缓存交换模块2用于实时更新缓存数据量,进而判断是否需要对所述数据进行大字段外缓存处理;如果需要,则向所述公共I/O服务模块4提交外缓存请求,再将处理后的数据添加到消息队列中;如果不需要,则直接将所述数据添加到消息队列。其中,所述公共I/O服务模块4用于与所述内外缓存交换模块2实现交互,当接收到外缓存请求时,所述公共I/O服务模块4用于将数据的大字段内容写到外存临时文件,完成大字段外缓存处理。具体实现方式可参考实施例1步骤10和步骤20的相关介绍,此处不再赘述。
同时,所述内外缓存交换模块2还用于从消息队列中获取数据,根据数据是否有大字段外缓存来决定是否需要进行数据恢复处理。如果需要,则向所述公共I/O服务模块4提交数据恢复请求,再将恢复后的数据传至所述数据装载组件3;如果不需要,则直接将从消息队列提取的数据传至所述数据装载组件3。其中,所述公共I/O服务模块4用于与所述内外缓存交换模块2实现交互,当接收到数据恢复请求时,所述公共I/O服务模块4用于从所述外存临时文件中读取数据的大字段内容,完成恢复数据。具体实现方式可参考实施例1步骤30的相关介绍,此处不再赘述。
其中,在本发明实施例中,所述内外缓存交换模块2主要提供两个功能接口:put()和take(),分别对应着所述内外缓存交换模块2的上述介绍的两方面的功能。
所述数据装载组件3用于将从所述内外缓存交换模块2获取的数据装载至目的端数据源,进而完成数据同步。其中,某些数据在装载至目的端之前,可能还需做一定的清洗转换工作,则所述装置中还优选的设置有数据转换组件,所述数据装载组件用于对数据进行清洗转换,完成后再由所述数据装载组件3将数据装载至目的端数据源。
其中,所述公共I/O服务模块4是一个独立的服务模块,有自己的执行线程,为所述数据读取组件1和所述数据装载组件3提供内外数据交换服务;将其作为一个独立的模块,是基于并发处理的考虑。具体可参考实施例1中的相关介绍,此处不再赘述。
本发明提供的数据同步时防止内存溢出的装置中,通过增加内外缓存交换模块和公共I/O服务模块,可将数据中占用内存过多的大字段内容暂时放到本地外存中缓存,在数据装载时再进行数据恢复,释放了内存,避免了同步服务器内部缓存大量数据,使数据读取组件尽可能地保持工作而不是做简单的暂停,提高了同步服务器同步数据的性能,同时也提高了同步服务器工作的稳定性。
实施例3:
在实施例1提供的一种数据同步时防止内存溢出的方法的基础上,本发明还提供了一种运用上述方法在数据同步时防止内存溢出的装置,如图7所示,是本发明实施例的装置架构示意图。本实施例的数据同步时防止内存溢出的装置包括一个或多个处理器21以及存储器22。其中,图7中以一个处理器21为例。
所述处理器21和所述存储器22可以通过总线或者其他方式连接,图7中以通过总线连接为例。
所述存储器22作为一种数据同步时防止内存溢出方法非易失性计算机可读存储介质,可用于存储非易失性软件程序、非易失性计算机可执行程序以及模块,如实施例1中的数据同步时防止内存溢出方法。所述处理器21通过运行存储在所述存储器22中的非易失性软件程序、指令以及模块,从而执行数据同步时防止内存溢出装置的各种功能应用以及数据处理,即实现实施例1的数据同步时防止内存溢出的方法。
所述存储器22可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实施例中,所述存储器22可选包括相对于所述处理器21远程设置的存储器,这些远程存储器可以通过网络连接至所述处理器21。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
所述程序指令/模块存储在所述存储器22中,当被所述一个或者多个处理器21执行时,执行上述实施例1中的数据同步时防止内存溢出的方法,例如,执行以上描述的图2、图4和图6所示的各个步骤。
本领域普通技术人员可以理解实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(ROM,Read Only Memory)、随机存取存储器(RAM,Random AccessMemory)、磁盘或光盘等。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

Claims (10)

1.一种数据同步时防止内存溢出的方法,其特征在于,包括:
从源端读取数据,根据消息队列中的已缓存数据量判断是否触发大字段外缓存,如果触发则对所述数据进行大字段外缓存处理;
将经外缓存处理后的数据缓存到消息队列中,并更新消息队列中的已缓存数据量;
从消息队列中取出数据并更新已缓存数据量,若取出的数据有大字段外缓存,则从外缓存中进行数据恢复;
将从消息队列取出的数据或经数据恢复后的数据装载至目的端,完成数据同步。
2.根据权利要求1所述的数据同步时防止内存溢出的方法,其特征在于,所述根据消息队列中的已缓存数据量判断是否触发大字段外缓存,如果触发则对所述数据进行大字段外缓存处理,具体包括:
计算从源端读取数据的数据字节大小;
计算消息队列中的已缓存数据量与所述数据字节大小的和值,并与第一内存阈值比较;
如果所述和值大小超过所述第一内存阈值,则对所述数据进行大字段外缓存处理。
3.根据权利要求2所述的数据同步时防止内存溢出的方法,其特征在于,对所述数据进行大字段外缓存处理的过程具体为:将所述数据中的大字段用临时文件元数据代替,并更新所述数据字节大小;将大字段和临时文件元数据进行提交,进而根据临时文件元数据将数据大字段的内容写到外存中的临时文件。
4.根据权利要求3所述的数据同步时防止内存溢出的方法,其特征在于,对有大字段外缓存的数据,从外缓存中进行数据恢复的过程具体为:根据所述数据对应的临时文件元数据结构,从所述临时文件中读入所述数据对应的大字段内容,进而完成数据恢复。
5.根据权利要求3或4所述的数据同步时防止内存溢出的方法,其特征在于,用于代替大字段的临时文件元数据包括临时文件名、大字段在临时文件中的起始位置以及大字段的长度。
6.根据权利要求1所述的数据同步时防止内存溢出的方法,其特征在于,所述方法还包括:将当前消息队列中的已缓存数据量与第二内存阈值比较;如果所述已缓存数据量超过所述第二内存阈值,则将所述消息队列中预设比例的数据进行大字段外缓存处理。
7.根据权利要求1所述的数据同步时防止内存溢出的方法,其特征在于,在所述从消息队列中取出数据之前,所述方法还包括:将所述消息队列中的数据按照经外缓存处理和未经外缓存处理进行分组,且所述未经外缓存处理的数据顺序靠前,所述经外缓存处理的数据顺序靠后,使得所述未经外缓存处理的数据先从消息队列中被取出。
8.根据权利要求1所述的数据同步时防止内存溢出的方法,其特征在于,如果当前从源端读取的数据需要进行大字段外缓存处理,则提交外缓存请求,同时直接从源端读取下一条数据,无需等待外缓存处理完成;
如果当前从消息队列中获取的数据需要进行数据恢复处理,则提交数据恢复请求,同时直接从所述消息队列中获取下一条数据,无需等待数据恢复完成。
9.一种数据同步时防止内存溢出的装置,其特征在于,包括数据读取组件(1)、内外缓存交换模块(2)、数据装载组件(3)以及公共I/O服务模块(4),其中,所述数据读取组件(1)用于从源端读取数据,使数据进入所述内外缓存交换模块(2);
所述内外缓存交换模块(2)用于实时更新缓存数据量,并判断是否需要对数据进行大字段外缓存处理,最后将数据添加到消息队列;同时,所述内外缓存交换模块(2)还用于从消息队列中获取数据,根据数据是否有大字段外缓存来决定是否进行数据恢复处理;
所述公共I/O服务模块(4)用于将数据的大字段内容写到外存的临时文件中,完成大字段外缓存处理;以及从所述临时文件中读取数据的大字段内容,完成恢复数据;
所述数据装载组件(3)用于将从所述内外缓存交换模块(2)获取的数据装载至目的端,进而完成数据同步。
10.一种数据同步时防止内存溢出的装置,其特征在于,包括至少一个处理器和存储器,所述至少一个处理器和存储器之间通过数据总线连接,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令在被所述处理器执行后,用于完成权利要求1-8任一所述的数据同步时防止内存溢出的方法。
CN201811010996.9A 2018-08-31 2018-08-31 一种数据同步时防止内存溢出的方法和装置 Active CN109189577B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201811010996.9A CN109189577B (zh) 2018-08-31 2018-08-31 一种数据同步时防止内存溢出的方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201811010996.9A CN109189577B (zh) 2018-08-31 2018-08-31 一种数据同步时防止内存溢出的方法和装置

Publications (2)

Publication Number Publication Date
CN109189577A true CN109189577A (zh) 2019-01-11
CN109189577B CN109189577B (zh) 2020-05-19

Family

ID=64917678

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201811010996.9A Active CN109189577B (zh) 2018-08-31 2018-08-31 一种数据同步时防止内存溢出的方法和装置

Country Status (1)

Country Link
CN (1) CN109189577B (zh)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110222115A (zh) * 2019-04-30 2019-09-10 武汉达梦数据库有限公司 基于表初始化分组装载的数据库同步方法及设备
CN112698789A (zh) * 2020-12-29 2021-04-23 广州鼎甲计算机科技有限公司 数据缓存方法、装置、设备及存储介质
CN113407556A (zh) * 2021-07-13 2021-09-17 南方电网数字电网研究院有限公司 基于消息队列的数据异步更新方法及装置
WO2021258696A1 (zh) * 2020-06-24 2021-12-30 珠海格力电器股份有限公司 通信数据处理方法、装置、计算机设备和存储介质
CN114817090A (zh) * 2022-06-09 2022-07-29 远峰科技股份有限公司 低ram消耗mcu通信管理方法及系统

Citations (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20020007420A1 (en) * 1998-12-18 2002-01-17 Microsoft Corporation Adaptive flow control protocol
US20020095399A1 (en) * 2000-08-04 2002-07-18 Devine Robert L.S. System and methods providing automatic distributed data retrieval, analysis and reporting services
US20040039888A1 (en) * 2002-08-21 2004-02-26 Lecrone Douglas E. Storage automated replication processing
CN101588344A (zh) * 2008-05-20 2009-11-25 中兴通讯股份有限公司 一种网络系统中控制同一帐户登录的系统及方法
CN102122256A (zh) * 2011-03-28 2011-07-13 中国人民解放军国防科学技术大学 一种用于进程间通信的管道式通信方法及系统
CN103838830A (zh) * 2014-02-18 2014-06-04 广东亿迅科技有限公司 一种HBase数据库的数据管理方法及系统
CN104572106A (zh) * 2015-01-12 2015-04-29 浪潮电子信息产业股份有限公司 一种基于小内存处理大规模数据的并行程序开发方法
CN105354246A (zh) * 2015-10-13 2016-02-24 华南理工大学 一种基于分布式内存计算的数据去重方法
CN106713487A (zh) * 2017-01-16 2017-05-24 腾讯科技(深圳)有限公司 数据的同步方法和装置
CN107992432A (zh) * 2017-11-28 2018-05-04 福建中金在线信息科技有限公司 一种数据缓存的方法及终端设备

Patent Citations (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20020007420A1 (en) * 1998-12-18 2002-01-17 Microsoft Corporation Adaptive flow control protocol
US20020095399A1 (en) * 2000-08-04 2002-07-18 Devine Robert L.S. System and methods providing automatic distributed data retrieval, analysis and reporting services
US20040039888A1 (en) * 2002-08-21 2004-02-26 Lecrone Douglas E. Storage automated replication processing
CN101588344A (zh) * 2008-05-20 2009-11-25 中兴通讯股份有限公司 一种网络系统中控制同一帐户登录的系统及方法
CN102122256A (zh) * 2011-03-28 2011-07-13 中国人民解放军国防科学技术大学 一种用于进程间通信的管道式通信方法及系统
CN103838830A (zh) * 2014-02-18 2014-06-04 广东亿迅科技有限公司 一种HBase数据库的数据管理方法及系统
CN104572106A (zh) * 2015-01-12 2015-04-29 浪潮电子信息产业股份有限公司 一种基于小内存处理大规模数据的并行程序开发方法
CN105354246A (zh) * 2015-10-13 2016-02-24 华南理工大学 一种基于分布式内存计算的数据去重方法
CN106713487A (zh) * 2017-01-16 2017-05-24 腾讯科技(深圳)有限公司 数据的同步方法和装置
CN107992432A (zh) * 2017-11-28 2018-05-04 福建中金在线信息科技有限公司 一种数据缓存的方法及终端设备

Cited By (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110222115A (zh) * 2019-04-30 2019-09-10 武汉达梦数据库有限公司 基于表初始化分组装载的数据库同步方法及设备
WO2021258696A1 (zh) * 2020-06-24 2021-12-30 珠海格力电器股份有限公司 通信数据处理方法、装置、计算机设备和存储介质
CN112698789A (zh) * 2020-12-29 2021-04-23 广州鼎甲计算机科技有限公司 数据缓存方法、装置、设备及存储介质
CN112698789B (zh) * 2020-12-29 2022-03-15 广州鼎甲计算机科技有限公司 数据缓存方法、装置、设备及存储介质
CN113407556A (zh) * 2021-07-13 2021-09-17 南方电网数字电网研究院有限公司 基于消息队列的数据异步更新方法及装置
CN114817090A (zh) * 2022-06-09 2022-07-29 远峰科技股份有限公司 低ram消耗mcu通信管理方法及系统
CN114817090B (zh) * 2022-06-09 2023-06-02 远峰科技股份有限公司 低ram消耗mcu通信管理方法及系统

Also Published As

Publication number Publication date
CN109189577B (zh) 2020-05-19

Similar Documents

Publication Publication Date Title
CN109189577A (zh) 一种数据同步时防止内存溢出的方法和装置
CN101996098A (zh) 管理消息队列
WO2012026034A1 (ja) スケジューラ、マルチコアプロセッサシステムおよびスケジューリング方法
US11132294B2 (en) Real-time replicating garbage collection
JP2970596B2 (ja) Atm通信装置
CN106815251B (zh) 分布式数据库系统、数据库访问方法及装置
DE19506734A1 (de) Computersystem und Verfahren zum Aufrechterhalten der Speicherkonsistenz in einer Busanforderungswarteschlange
CN106325758B (zh) 一种队列存储空间管理方法及装置
CN109492018A (zh) 一种数据同步系统自适应动态调整方法和装置
JPH09167145A (ja) メッセージ・キューのアクセス方法
CN110377531A (zh) 基于日志结构的持久性内存存储引擎装置及控制方法
CN109358805B (zh) 一种数据缓存方法
CN110532205A (zh) 数据传输方法、装置、计算机设备和计算机可读存储介质
CN107197050A (zh) 一种分布式存储系统中文件写入的方法及系统
CN101651825A (zh) 数据采集上传方法和系统
CN111177254B (zh) 一种异构关系型数据库之间数据同步的方法和装置
CN109213462A (zh) Android横竖屏数据同步方法、装置、终端及可读介质
CN109271113A (zh) 一种基于云存储的数据管理系统及方法
CN107169102B (zh) 用于界面显示的数据查询方法、装置、计算机设备及存储介质
CN108369547A (zh) 持久性主存储器中的日志的尾部
CN109710679A (zh) 数据抽取方法及装置
CN109117086A (zh) 存储设备数据位置的处理方法、装置、设备及存储介质
CN107329695A (zh) 一种分布式存储内存管理方法、系统及计算机存储介质
CN107786670A (zh) 一种本地存储数据和云存储结合运用的系统和方法
CN108958903A (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
GR01 Patent grant
GR01 Patent grant
CP01 Change in the name or title of a patent holder

Address after: 430000 High-tech Avenue 999, Donghu New Technology Development Zone, Wuhan City, Hubei Province

Patentee after: Wuhan dream database Co.,Ltd.

Address before: 430000 High-tech Avenue 999, Donghu New Technology Development Zone, Wuhan City, Hubei Province

Patentee before: WUHAN DAMENG DATABASE Co.,Ltd.

CP01 Change in the name or title of a patent holder
TR01 Transfer of patent right

Effective date of registration: 20220907

Address after: 430073 16-19 / F, building C3, future science and technology building, 999 Gaoxin Avenue, Donghu New Technology Development Zone, Wuhan City, Hubei Province

Patentee after: Wuhan dream database Co.,Ltd.

Patentee after: HUAZHONG University OF SCIENCE AND TECHNOLOGY

Address before: 430000 16-19 / F, building C3, future technology building, 999 Gaoxin Avenue, Donghu New Technology Development Zone, Wuhan, Hubei Province

Patentee before: Wuhan dream database Co.,Ltd.

TR01 Transfer of patent right
TR01 Transfer of patent right

Effective date of registration: 20230804

Address after: 16-19/F, Building C3, Future Science and Technology Building, No. 999 Gaoxin Avenue, Donghu New Technology Development Zone, Wuhan City, Hubei Province, 430206

Patentee after: Wuhan dream database Co.,Ltd.

Address before: 430073 16-19 / F, building C3, future science and technology building, 999 Gaoxin Avenue, Donghu New Technology Development Zone, Wuhan City, Hubei Province

Patentee before: Wuhan dream database Co.,Ltd.

Patentee before: HUAZHONG University OF SCIENCE AND TECHNOLOGY

TR01 Transfer of patent right