一种在内存中缓存数据的方法及装置的制作方法

文档序号:6571048阅读:336来源:国知局
专利名称:一种在内存中缓存数据的方法及装置的制作方法
技术领域
本发明涉及数据处理领域,特别是涉及在内存中缓存数据领域。
背景技术
随着计算机技术的发展,功能更强的计算机不断出现,其计算能力不断提高,可以处理的数据量也越来越大。在计算机进行数据处理时,待处理的数据需要先被读入计算机的内存,然后才能由计算机的处理器进行处理,内存是计算机的数据存储部件,存放当前正在使用的数据和程序,但由于内存芯片的成本高,制造工艺复杂,无法象外存储设备一样做成海量容量,于是合理利用有限的内存资源成为各种计算机应用程序所要解决的问题。在进行数据处理时,经常需要处理几十兆到几百兆的数据,这些数据可以是保存在本地文件中的,也可以是网络上的,它们都可以看做一个流对象,采用流的操作对其进行读写。当采用流方式对多媒体文件的上载和下载时,需要将一些文件流或网络流中的数据缓存在内存中,转换成内存流,以方便后续的读取和处理,同样的,有时候也需要先创建内存流,再转换成文件流或网络流进行存储或者通过网络传输。在这两个过程中,我们都需要把数据缓存在内存中。
在应用软件系统中,目前的内存流是使用一个连续的数组来实现数据缓存的,一般包括下面的步骤(1)获取待缓存流对象数据量的大小;(2)向当前操作系统申请大小和待缓存流对象数据量一样大小的内存空间,在内存空间中创建数组,所述数组占用的必须是连续的内存空间;(3)读取待缓存流对象数据,按顺序写入数组中,直到写完待缓存流对象中的所有数据;(4)将在内存空间中的数组封装成为内存流对象,供应用程序使用。
使用现有的内存流缓存数据的方法,存在下面的问题由于计算机中的内存被多个应用程序频繁使用,造成内存碎片较多,能够被使用的连续的空闲空间减少,当要缓存大的流对象而创建内存流时,不易申请到连续的空间供内存流使用;当无法得到连续的内存空间时,系统会尝试整理当前内存(回收当前可用内存、合并内存碎片),当仍旧不能满足时,内存流的空间申请被置入等待队列,系统会不停尝试整理内存,直到有能够满足内存流要求的连续的空闲内存空间;如果一直不能得到满足要求的内存空间,内存流将无法创建;在繁忙的服务器环境中,频繁的内存整理占用了大量计算机资源,可能会引起在其上运行的应用程序停止响应,或者引起系统宕机。可见,现有内存流缓存数据的方法存在着不易获取连续内存空间和影响计算机系统的正常运行的问题。

发明内容
本发明所要解决的技术问题是提供了一种在内存中缓存数据的方法及装置,以解决现有技术中不易获取内存空间和影响系统的正常运行的问题。
为了解决上述技术问题,本发明公开了一种在内存中缓存数据的方法,包括按照预置的容量参数创建数组,所述数组占用连续内存空间;接收待缓存数据,写入所述数组中;把所述数组的地址信息记录在预置的线性表中;重复执行上述步骤,直到所有的待缓存数据都被写入数组并记录在线性表中。
优选的,还包括,接收应用程序的数据读取指令;按照所述线性表中记录的数组的地址信息,按顺序读出各数组中的数据,发送给应用程序。
优选的,所述待缓存数据来自本地文件数据流或者网络数据流。
优选的,所述线性表是顺序表或者链表。
优选的,还包括,将所述数组和所述线性表封装为流接口对象。
本发明还提供了一种在内存中缓存数据的装置,其特征在于,包括数组创建单元,用于按照预置的容量参数创建数组,所述数组占用连续内存空间;数据写入单元,用于接收待缓存数据,写入所述数组中;地址信息记录建单元,用于把所述数组的地址信息记录在预置的线性表中;
控制单元,用于控制上述各单元的执行,直到所有的待缓存数据都被写入数组并记录在线性表中。
优选的,还包括,命令接收单元,用于接收应用程序的数据读取命令;数据读取单元,用于按照所述线性表中记录的数组的地址信息,按顺序读出各数组中的数据,发送给应用程序。
优选的,所述待缓存数据来自本地文件数据流或者网络数据流。
优选的,所述线性表是顺序表或者链表。
优选的,还包括,对象封装单元,用于将所述数组和所述线性表封装为流接口对象。
与现有技术相比,本发明具有以下优点1、采用多个小的数组分段存放缓存的数据,小的数组需要占用的连续内存空间也较小,多个数组的所占用的内存空间可以不是连续的,这种小段的内存空间易于在内存中获取,这种采用获取多个小的不连续内存空间来代替获取一个大的连续内存空间的办法,解决了现有技术中不易获取连续内存空间的问题。
2、由于本发明使用小的数组分段缓存数据,而小的数组所需的内存空间往往不需要系统进行内存整理就可以获得,本发明比现有技术减少了需要进行内存整理的次数,减少了内存整理过程中占用系统资源对计算机系统的正常运行的影响。


图1是本发明的方法实施例1流程图;图2是本发明的方法实施例2流程图;图3是本发明的装置实施例框图。
具体实施例方式
为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式
对本发明作进一步详细的说明。
首先叙述一下本发明的核心思想。在计算机中,内存资源是有限,而且内存往往被多个应用程序所使用,应用程序的运行需要经常调度不同的进程进行执行,进程被调度运行时,会经常申请占用内存空间,操作系统会根据进程的要求,从连续和空闲的内存空间中分出一部分满足要求的空间给进程使用,当进程退出运行时,释放所占用的内存空间,但由于和此部分空间相邻的其他空间已经分配给其它的应用程序或进程了,此空间释放后,就成为一个单独的空间,形成内存空间的碎片,由于系统中有多个应用程序,多次进行上面的内存分配过程,内存空间可能存在很多的碎片。
在现在的数据处理的应用中,经常需要处理大量的数据,这些数据可能来自网络和本地文件中,这些数据可以当作数据流来操作,如在具体的程序语言中,可以先把带缓存的数据初始化一个数据流,通过读取数据流就可以读取待缓存的数据,把它们作为数据流来操作,处理上可以比较方便。计算机要对这些待缓存数据进行处理,必须先要把这些数据先装载进计算机的内存中,只用在内存中的数据才能被计算机的CPU(中央处理器)直接处理。
在现有技术中,应用程序缓存这些来自文件或者网络的数据流时,需要在内存中申请连续的内存空间,当数据流的数据量比较大时,需要申请的连续内存空间也比较大,当向系统申请的空间大于目前系统中最大的连续的内存空间时,因为系统中没有这样的连续空间,就会发生不能分配内存空间的问题,应用程序会处于等待状态,直到有合适的内存空间被分配,同时,操作系统会做内存整理工作,试图回收未被使用的已分配内存空间,合并正在使用的内存空间,内存整理费常耗费系统资源,有可能使所有的应用程序响应缓慢或处于等待状态,影响系统的正常运行,如果频繁进行内存整理,容易造成系统宕机,为了易于获取需要的内存空间,减少系统内存整理的次数,本发明把获取的连续的整块内存空间改变为获取多个小块的内存空间,并通过一定的算法把不连续的空间组织起来,可以封装成为内存流对象,供应用程序调用。
参见图1,是本发明的方法实施例1流程图,包括步骤101,按照预置的容量参数创建数组,所述数组占用连续内存空间;为了能在内存中缓存数据,需要在内存中建立数组,并把数据写入数组,从而实现缓存数据的目的,建立数组的过程就是向系统申请空间的过程,在内存中,数组需要占用连续的内存空间,合理的设置数组的容量参数,可以使申请的连续内存的大小合适以便于获取,由于这个容量参数和当前内存的大小有关系,设置此参数时,可以参照当前物理内存值的大小,例如可以设定为当前物理内存的1/10,也可以设置为通过试验后得到的经验值。
优选的,在本步骤中可以创建一维数组,也可以创建多维数组,两者在存储数据上作用相同,只是在写入和读取数据的具体操作方法上有些差异。
步骤102,接收待缓存数据,写入所述数组中。
从数据源中读取待缓存的数据,写入所述的数组中。在读取过程中,可以顺序读取,读取数据后,按照顺序写入数组中。
步骤103,把所述数组的地址信息记录在预置的线性表中。
数组可以看做是由一段连续的内存空间构成的,使用数组时,可以通过引用其首地址来使用,例如在c语言中,数组就是指向数组首单元地址的指针,只要纪录了数组名,就可以对数组进行读写操作。在本步骤中,把前述步骤中创建并写入数据的数组的地址信息按顺序记录预先设置的线性表中,在后续步骤中可以通过读取线性表来获得数组的地址信息,从而可以对数组进行操作。
步骤104,重复执行上述步骤,直到所有的待缓存数据都被写入数组并记录在线性表中。
当有未读取的待缓存数据时,重复执行步骤101到步骤103,直到所有数据都被写入数组中。
当存在未读的待缓存数据时,按照预置的容量参数,再创建一个新的数组,读取待缓存的数据,写入数组中,然后把数组的地址记录在所述的线性表中,如果还存在未读的数据,就仍然重复上述过程。
把数组的地址信息记录在所述的线性表中时,也需要记录每个数组之间的先后关系,可以采用两种方式来实现,一种是顺序存储各个数组的地址信息,其顺序的关系就代表了各个数组的先后顺序关系,这种方式的优点是在现有节点尾部添加新节点方便,但对中间节点的插入和删除操作不便;另一种是作为链表来处理,每个节点包括一个指针域和一个数据域,指针域指向下一个节点,数据域用于保存数组的地址信息。
优选的,还包括接收应用程序的数据读取指令;按照所述线性表中记录的数组的地址信息,读出数组中的数据,发送给应用程序。
当应用程序需要读取缓存在内存中的数据时,发出数据读取指令,此指令可以是读取全部数据的指令,也可以是读取数据中某个相对地址段中的数据。
由于所有的保存数据的数组的地址信息,都已经保存在所述的线性表中,当接收到的数据读取指令是读取全部数据的指令时,按照所述线性表中的地址信息顺次读取各数组的地址信息,并读取数组中的数据,发送给应用程序;当应用程序需要读取数据中某个相对地址段中的数据时,首先根据所述线性表中的数据及数组的容量参数推算出所要读取的数据位于哪个数组中,然后读取所述线性表,得到所要读取的数组的地址信息,读取数据的数据,推算出所需要的数据在数组内的相对地址,得到数据,例如缓存数据的总数是98字节,每个数组的容量参数是10字节,现要读取第32字节位置上的数据,32/10=3.2,可见数据位于第4个数组的第2个单元中,先从保存数组地址信息的线性表中读取第4个数组的地址信息,按照地址信息找到并读取数组中的第2个单元中的数据,返回给应用程序。
优选的,所述待缓存数据来自本地文件数据流或者网络数据流。
待缓存数据的来源,即可以是本地的数据文件,也可以是网络上的数据,它们都可以采用流的方式来进行操作,数据本身可以是任何数据,例如,数据的本身就是单纯的应用程序数据,也可以是各种多媒体数据或者其它数据。
优选的,所述线性表是顺序表或者链表。
线性表的存储结构可以用顺序表或者链表来实现。
顺序表是按线性表的逻辑结构次序依次存放在一组地址连续的存储单元中。在存储单元中的各元素的物理位置和逻辑结构中各结点相邻关系是一致的。
链表是用一组任意的存储单元来存放线性表的结点,这组存储单元可以分布在内存中任何位置上。因此,链表中结点的逻辑次序和物理次序不一定相同。所以为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还存储了其后继结点的地址信息(即指针或链)。这两部分信息组成链表中的结点结构。一个单链表由头指针的名字来命名。对于单链表,其操作运算主要有建立单链表(头插法、尾插法和在链表开始结点前附加一个头结点的算法)、查找(按序号和按值)、插入运算、删除运算等。以上各运算的平均时间复杂度均为0(n).其主要时间是耗费在查找操作上。
优选的,还包括,将所述数组和所述线性表封装为流接口对象。
为了便于使用,可以将所述的数组和所述的线性表封装为流接口对象,封装过程可以使用面向对象的各种语言来实现,封装中,为方便使用,还可以封装另外的方法调用,例如,数据写入和读取的方法等。
作为实施例1的一个扩展,也可以先使用具体的代码按照上述步骤中的操作实现分段流接口对象,把对数据的操作封装成为所述分段流接口对象的方法,把保存数组地址信息的线性表封装为所述分段流接口对象的内部对象,并可以通过方法调用来读取或写入地址信息,还可以根据实际的需要封装其它方法或者内部对象,然后通过调用分段流接口对象所封装的各种方法和内部对象来实现对待缓存数据流的缓存。
参见图2,是本发明的方法实施例2流程图,本实施例以读取10M视频文件数据流为例,包括步骤201,设定单个小数组的大小参数sectionSize,例如可以设定为3M。
步骤202,创建一个分段流接口对象SectionByteInputStream。
分段流接口对象SectionByteInputStream中可以预先创建数组和链表,用于存储数据和数组间的顺序关系,也可以只创建链表,数组直接使用被加入到分段流接口对象中的数组,不另外创建数组。
步骤203,按照设定单个小数组的大小参数创建数组buf。
步骤204,按顺序读取视频文件数据流,依次写到数组buf中。
步骤205,并将数组buf添加到分段流接口对象SectionByteInputStream中。
步骤206,每读取sectionSize大小的视频文件数据流则重复步骤203到步骤205,直至读取全部视频文件数据流。
步骤207,应用程序通过流分段流接口对象SectionByteInputStream访问流数据。
参见图3,是本发明的装置实施例框图,包括数组创建单元301,用于按照预置的容量参数创建数组,所述数组占用连续内存空间;
数据写入单元302,用于接收待缓存数据,写入所述数组中;地址信息记录单元303,用于把所述数组的地址信息记录在预置的线性表中;控制单元304,用于控制上述各单元的执行,直到所有的待缓存数据都被写入数组并记录在线性表中。
数组创建单元301创建合适大小的数组,数据写入单元302读取待缓存的数据并写入所述数组中,地址信息记录建单元303把所述数组的地址信息,一般是数组首单元的地址,记录到预先设置的线性表中,控制单元304判断是否还有未读的待缓存数据,如果存在,控制数组创建单元301、数据写入单元302和地址信息记录建单元303重复读取待缓存数据并保存到数组中,直到所有待缓存数据都被读入数组。
优选的,所述装置还包括,命令接收单元305,用于接收应用程序的数据读取命令;数据读取单元306,用于按照所述线性表中记录的数组的地址信息,按顺序读出各数组中的数据,发送给应用程序。
优选的,所述待缓存数据来自本地文件数据流或者网络数据流。
优选的,所述线性表是顺序表或者链表。
优选的,所述装置还包括,对象封装单元,用于将所述数组和所述线性表封装为流接口对象。
以上对本发明所提供的一种在内存中缓存数据的方法及装置,进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式
及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
权利要求
1.一种在内存中缓存数据的方法,其特征在于,包括按照预置的容量参数创建数组,所述数组占用连续内存空间;接收待缓存数据,写入所述数组中;把所述数组的地址信息记录在预置的线性表中;重复执行上述步骤,直到所有的待缓存数据都被写入数组并记录在线性表中。
2.根据权利要求1中所述的方法,其特征在于,在所述方法之后,还包括,接收应用程序的数据读取指令;按照所述线性表中记录的数组的地址信息,按顺序读出各数组中的数据,发送给应用程序。
3.根据权利要求1或2中所述的方法,其特征在于,所述待缓存数据来自本地文件数据流或者网络数据流。
4.根据权利要求1或2中所述的方法,其特征在于,所述线性表是顺序表或者链表。
5.根据权利要求1或2中所述的方法,其特征在于,还包括,将所述数组和所述线性表封装为流接口对象。
6.一种在内存中缓存数据的装置,其特征在于,包括数组创建单元,用于按照预置的容量参数创建数组,所述数组占用连续内存空间;数据写入单元,用于接收待缓存数据,写入所述数组中;地址信息记录建单元,用于把所述数组的地址信息记录在预置的线性表中;控制单元,用于控制上述各单元的执行,直到所有的待缓存数据都被写入数组并记录在线性表中。
7.根据权利要求6中所述的装置,其特征在于,还包括,命令接收单元,用于接收应用程序的数据读取命令;数据读取单元,用于按照所述线性表中记录的数组的地址信息,按顺序读出各数组中的数据,发送给应用程序。
8.根据权利要求6或7中所述的装置,其特征在于,所述待缓存数据来自本地文件数据流或者网络数据流。
9.根据权利要求6或7中所述的装置,其特征在于,所述线性表是顺序表或者链表。
10.根据权利要求6或7中所述的装置,其特征在于,还包括,对象封装单元,用于将所述数组和所述线性表封装为流接口对象。
全文摘要
本发明公开了一种在内存中缓存数据的方法及装置,其中所述方法包括下列步骤按照预置的容量参数创建数组,所述数组占用连续内存空间;接收待缓存数据,写入所述数组中;把所述数组的地址信息记录在预置的线性表中;重复执行上述步骤,直到所有的待缓存数据都被写入数组并记录在线性表中。本发明获取多个小的不连续内存空间用于缓存数据,解决了现有技术中需要获取大的连续内存空间的问题,并且减少了内存整理的次数,有利于计算机系统的正常稳定的运行。
文档编号G06F17/30GK101013400SQ200710003019
公开日2007年8月8日 申请日期2007年1月30日 优先权日2007年1月30日
发明者符修湖 申请人:金蝶软件(中国)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1