本发明涉及流数据存储技术领域,具体涉及一种流数据的并发读写方法以及一种流数据的并发读写装置。
背景技术:
流数据为可以采用流式传输的方式在网络上传输的数据,大型网站系统经常依赖于内容分发网络(Content Delivery Network,CDN)对流数据进行传输,内容分发网络是通过在现有的网络中增加一层新的网络结构,使用户可以将数据传输到就近的节点上或从就近的节点获取所需的数据。在内容分发网络中,部署有传输节点,用于缓冲流数据,就近给用户提供服务。
流数据在经传输节点进行分发时,可采用并发读写的工作方式,在向共享内存的缓冲队列中写入流数据的同时,从共享内存的缓冲队列读取流数据。通常对于同一流数据,会同时存在一个写访问和多个读访问。因此,可能存在对缓冲队列的相同位置同时发起读、写访问的情况,将会导致缓冲队列中的数据混乱,数据的一致性会出现问题。
为了避免上述问题,通常采用锁操作的方式来避免读和写的位置不会重叠,锁操作是一种保证互斥访问内存的保护措施,具体而言,当同时发起对流数据队列的读和/或访问时,要求访问操作首先获取流数据队列的互斥锁,才能具有访问流数据队列的权限,获得互斥锁的访问操作访问流数据队列,并在结束对流数据队列的访问时,释放互斥锁,之后其他访问操作可根据获取的互斥锁依次访问流数据队列。
利用锁操作的方式虽然避免了对流数据队列进行同时操作时引起的数据混乱和访问数据出错的问题,但是通过锁操作的方式控制并发读写,由于请求锁、等待锁和释放锁都会增加处理开销,消耗处理器时间,使得在执行锁操作的过程中造成CPU资源的浪费。
技术实现要素:
鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的流数据的并发读写方法和相应的装置。
依据本发明的一个方面,提供了一种流数据的并发读写方法,包括:
将流数据循环顺次写入由多个数据队列构建的存储区;
从所述存储区读取流数据时,预估当前写入数据队列之后的预备写入数据队列为待读取数据队列;
从待读取数据队列转向读取流数据更新的第一目标数据队列。
可选地,所述将流数据循环顺次写入由多个数据队列构建的存储区包括:
顺次向各个数据队列写入设定的数据时长的流数据。
可选地,所述预估当前写入数据队列之后的预备写入数据队列为待读取数据队列包括:
判断当前时间距离待读取数据队列的起始写入时间是否超出第一时间阈值;
若是,则确定当前写入数据队列之后的预备写入数据队列可能为待读取数据队列,所述第一时间阈值为除去一个数据队列之外其他队列的时间长度的总和。
可选地,所述从待读取数据队列转向读取流数据更新的第一目标数据队列包括:
查找存储有最新流数据的第一目标数据队列;
读取查找的第一目标数据队列。
可选地,所述查找存储有最新流数据的第一目标数据队列包括:
提取各个数据队列的起始写入时间;
查找起始写入时间距离当前时间最近的数据队列为第一目标数据队列。
可选地,所述查找存储有最新流数据的第一目标数据队列包括:
调用流数据读取线程访问流数据写入线程;
接收流数据写入线程反馈的最新流数据的第一目标数据队列的队列标识。
可选地,所述方法还包括:
在将流数据写入某一数据队列后,对设定位置记录的最新队列进行更新;
所述查找存储有最新流数据的第一目标数据队列包括:
在所述设定位置查找存储有最新流数据的最新队列。
可选地,在所述读取查找的第一目标数据队列之前,所述从待读取数据队列转向读取流数据更新的第一目标数据队列还包括:
查找所述第一目标数据队列中的最新画面组;
所述读取查找的第一目标数据队列包括:
在所述第一目标数据队列中,从所查找的最新画面组开始读取流数据。
可选地,在所述查找所述第一目标数据队列中的最新画面组之后,包括:
查找所述第一目标数据队列中的最新画面组的I帧;
所述在所述第一目标数据队列中,从所查找的最新画面组开始读取流数据包括:
在所述第一目标数据队列中,从所查找的最新画面组的I帧开始读取流数据。
可选地,所述方法还包括:
在读取前一数据队列时,根据最后读取的流数据预估下一个读取的流数据;
判定待读取的下一数据队列的第一个流数据并非预估的流数据时,从所述待读取的下一数据队列转向读取除待写入的下一数据队列之外的第二目标数据队列。
可选地,所述从所述待读取的下一数据队列转向读取除待写入的下一数据队列之外的第二目标数据队列包括:
查找起始写入时间距离当前时间未超出第二时间阈值的任一第二目标数据队列,所述第二时间阈值为除去一个数据队列之外其他队列的时间长度的总和。
可选地,所述从所述待读取的下一数据队列转向读取除待写入的下一数据队列之外的第二目标数据队列包括:
从所述待读取的下一数据队列转向读取存储有最新流数据的第二目标数据队列。
可选地,在所述将流数据循环顺次写入由多个数据队列构建的存储区之前,所述方法还包括:
接收从另一传输节点推送至当前传输节点的流数据;
在所述从所述存储区读取流数据之前,所述方法还包括:
接收从当前传输节点对流数据的读取请求。
可选地,所述将流数据循环顺次写入由多个数据队列构建的存储区包括:
由流数据写入线程将流数据循环顺次写入由多个数据队列构建的存储区;
所述从所述存储区读取流数据包括:
由流数据读取线程从所述存储区读取流数据。
可选地,所述由流数据读取线程从所述存储区读取流数据包括:
记录当前读取的数据队列的队列标识和流数据的位置标识;
推算下一个读取的流数据的位置标识和队列标识,并进行读取。
可选地,所述从所述存储区读取流数据包括:
按照数据队列的队列标识顺次从各个数据队列读取流数据。
根据本发明的另一方面,提供了一种流数据的并发读写装置,包括:
流数据写入模块,用于将流数据循环顺次写入由多个数据队列构建的存储区;
预估模块,用于从所述存储区读取流数据时,预估当前写入数据队列之后的预备写入数据队列为待读取数据队列;
第一队列读取模块,用于从待读取数据队列转向读取流数据更新的第一目标数据队列。
可选地,所述流数据写入模块,具体用于顺次向各个数据队列写入设定的数据时长的流数据。
可选地,所述预估模块包括:
第一判断子模块,用于判断当前时间距离待读取数据队列的起始写入时间是否超出第一时间阈值;
第一确定子模块,用于若是,则确定当前写入数据队列之后的预备写入数据队列可能为待读取数据队列,所述第一时间阈值为除去一个数据队列之外其他队列的时间长度的总和。
可选地,所述第一队列读取模块包括:
第一查找子模块,用于查找存储有最新流数据的第一目标数据队列;
第一读取子模块,读取查找的第一目标数据队列。
可选地,所述第一查找子模块包括:
写入时间提取子单元,用于提取各个数据队列的起始写入时间;
第一查找子单元,用于查找起始写入时间距离当前时间最近的数据队列为第一目标数据队列。
可选地,所述第一查找子模块包括:
写入线程调用子单元,用于调用流数据读取线程访问流数据写入线程;
队列标识接收子单元,接收流数据写入线程反馈的最新流数据的第一目标数据队列的队列标识。
可选地,所述装置还包括:
最新队列更新模块,用于在将流数据写入某一数据队列后,对设定位置记录的最新队列进行更新;
所述第一查找子模块,具体用于在所述设定位置查找存储有最新流数据的最新队列。
可选地,所述第一队列读取模块还包括:
画面组查找子单元,用于在所述读取查找的第一目标数据队列之前,查找所述第一目标数据队列中的最新画面组;
所述第一读取子模块,具体用于在所述第一目标数据队列中,从所查找的最新画面组开始读取流数据。
可选地,所述装置还包括:
帧查找子模块,用于在所述查找所述第一目标数据队列中的最新画面组之后,查找所述第一目标数据队列中的最新画面组的I帧;
所述第一读取子模块,具体用于在所述第一目标数据队列中,从所查找的最新画面组的I帧开始读取流数据。
可选地,所述装置还包括:
流数据预估模块,用于在读取前一数据队列时,根据最后读取的流数据预估下一个读取的流数据;
第二队列读取模块,用于判定待读取的下一数据队列的第一个流数据并非预估的流数据时,从所述待读取的下一数据队列转向读取除待写入的下一数据队列之外的第二目标数据队列。
可选地,所述第二队列读取模块包括:
第二查找子单元,用于查找起始写入时间距离当前时间未超出第二时间阈值的任一第二目标数据队列,所述第二时间阈值为除去一个数据队列之外其他队列的时间长度的总和。
可选地,所述第二队列读取模块,具体用于从所述待读取的下一数据队列转向读取存储有最新流数据的第二目标数据队列。
可选地,所述装置还包括:
流数据接收模块,用于在所述将流数据循环顺次写入由多个数据队列构建的存储区之前,接收从另一传输节点推送至当前传输节点的流数据;
所述装置还包括:
读取请求接收模块,用于在所述从所述存储区读取流数据之前,接收从当前传输节点对流数据的读取请求。
可选地,所述流数据写入模块,具体用于由流数据写入线程将流数据循环顺次写入由多个数据队列构建的存储区;
所述预估模块包括:
线程读取子模块,用于由流数据读取线程从所述存储区读取流数据。
可选地,所述线程读取子模块包括:
标识记录子单元,用于记录当前读取的数据队列的队列标识和流数据的位置标识;
推算与读取子单元,用于推算下一个读取的流数据的位置标识和队列标识,并进行读取。
可选地,所述预估模块包括:
顺次读取子模块,用于按照数据队列的队列标识顺次从各个数据队列读取流数据。
根据本发明的一种流数据的并发读写方法和装置可以通过将流数据循环顺次写入由多个数据队列构建的存储区,从所述存储区读取流数据时,预估当前写入数据队列之后的预备写入数据队列为待读取数据队列,从待读取数据队列转向读取流数据更新的第一目标数据队列,使得可以通过在预估到预备写入数据队列为待读取数据队列情况下,转向读取流数据更新的数据队列,防止当前写入数据队列被写满后,转到预备写入数据队列,也就是待读取数据队列开始写入,避免出现待读取数据队列中的流数据被写入操作所删除或覆盖的情况发生,相比通过锁操作的方式控制并发读写,降低了流数据并发读写时的处理器资源占用,提高了流数据的并发读写的效率。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
图1示出了根据本发明实施例一的一种流数据的并发读写方法的步骤流程示意图;
图2示出了根据本发明实施例二的一种流数据的并发读写方法的步骤流程示意图;
图3示出了根据本发明实施例三的一种流数据的并发读写方法的步骤流程示意图;
图4示出了根据本发明实施例四的一种流数据的并发读写装置的结构框图。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
参照图1,示出了根据本发明实施例一的一种流数据的并发读写方法的步骤流程示意图,具体可以包括如下步骤:
步骤101,将流数据循环顺次写入由多个数据队列构建的存储区。
本发明可以应用在视频直播或远程摄像头等服务中,在视频直播应用或远程摄像头应用中,需要经过传输节点分发流数据,其中,流数据为可以采用流式传输的方式在网络上传输的数据,传输节点是指用于分发流数据的流媒体服务器。
在本发明实施例中,存储区为传输节点的内存中为流数据读写分配的一段存储空间,具体采用队列的数据结构,由多个数据队列组成一个存储区,该存储区可以循环顺次地被写入或读取。存储区可以由任意适用的个数的数据队列组成,本发明实施例对此不做限制。
具体而言,流数据写入时,从第一个数据队列开始顺次写入,并在写满存储区后,再从第一个数据队列开始顺次写入,以此方式实现将流数据循环顺次地写入存储区。
例如,存储区是由7个数据队列组成,设定每个数据队列中存储5秒的视频流数据。先从第1个数据队列开始顺次写入,每次写满5秒的视频流数据后,切换到下一个数据队列继续写入,直到7个数据队列全部写满,再从第1个数据队列开始,用新的数据队列覆盖掉第1个数据队列中的视频流数据,以此方式继续循环地将视频流数据写入7个数据队列构建地存储区。
在视频直播或远程摄像头的应用场景下,一个传输节点上通常会同时有多个流数据的分发任务,为每个流数据分配对应的由多个数据队列构建的存储区,当有视频流数据传输到传输节点时,将视频流数据以上述方式写入由多个数据队列构建的存储区,以供流数据传输连接从存储区中读取视频流数据。
步骤102,从所述存储区读取流数据时,预估当前写入数据队列之后的预备写入数据队列为待读取数据队列。
在本发明实施例中,从存储区读取流数据时,通常当一个数据队列中的数据读取完毕后,顺次读取下一个数据队列中的流数据,以此方式循环地从存储区地各个数据队列中读取流数据。当前写入数据队列为当前正在写入流数据的队列,预备写入数据队列为当前写入数据队列被写满后要被写入的数据队列,待读取数据队列为当前准备要读取流数据的队列。多个读取并发时,每个读取操作对应一个待读取数据队列。
对于每个读取操作,在每次从数据队列中读取流数据时,需要先进行预估,预估到待读取数据队列为当前写入数据队列之后的预备写入数据队列情况,也就是当前正在读取的队列是否就是当前正在写入的数据队列之后要写入的一个数据队列的情况。如果待读取数据队列不是当前写入数据队列之后的预备写入数据队列,那么继续从待读取数据队列中读取数据;如果待读取数据队列为当前写入数据队列之后的预备写入数据队列,那么执行按照步骤103执行下一步操作。
具体可以采用任意适用的方式预估待读取数据队列为当前写入数据队列之后的预备写入数据队列,本实施例对此不作限定。例如,在视频直播应用中,由于每个数据队列中存储5秒的视频流数据,那么第1个数据队列中的起始的流数据生成的时间一定比第7个数据队列中的起始的流数据生成的时间要早至少30秒。对于每个数据队列记录有起始写入该数据队列的时间,而流数据写入数据队列的时间一定晚于流数据生成的时间,如果待读取数据队列为第1个数据队列,在读取流数据前进行判断,如果当前时间减去第1个数据队列对应的起始写入时间的差值大于等于30秒,那么当前写入数据队列就有可能是第7个数据队列,而第1个数据队列为第7个数据队列之后的预备写入数据队列。由此根据记录的每个数据队列的写入时间,预估出当前写入数据队列之后的预备写入数据队列为待读取数据队列。
步骤103,从待读取数据队列转向读取流数据更新的第一目标数据队列。
第一目标数据队列为存储有相比待读取数据队列更新的流数据的数据队列。由于存储区中数据队列中的数据时顺序写入的,那么待读取数据队列之后直到当前写入数据队列的数据队列都可以作为第一目标数据队列。具体选择哪一个流数据更新的数据队列作为第一目标数据队列,本实施例对此不做限定。
当预估到当前写入数据队列之后的预备写入数据队列为待读取数据队列时,为了防止当前写入数据队列被写满后,转到待读取数据队列开始写入,导致出现待读取数据队列中的流数据被写入操作所删除或覆盖的情况发生,转为读取流数据更新的第一目标数据队列。例如,将待读取数据队列的下一个数据队列作为第一目标数据队列,或者将当前写入数据队列作为第一目标数据队列,并且只要保证写入的位置在读取的位置之前,那么待读取的位置的流数据就不会被写入操作所删除或覆盖。
综上所述,依据本发明实施例,通过将流数据循环顺次写入由多个数据队列构建的存储区,从所述存储区读取流数据时,预估当前写入数据队列之后的预备写入数据队列为待读取数据队列,从待读取数据队列转向读取流数据更新的第一目标数据队列,使得可以通过在预估到预备写入数据队列为待读取数据队列情况下,转向读取流数据更新的数据队列,防止当前写入数据队列被写满后,转到预备写入数据队列,也就是待读取数据队列开始写入,避免出现待读取数据队列中的流数据被写入操作所删除或覆盖的情况发生,相比通过锁操作的方式控制并发读写,降低了流数据并发读写时的处理器资源占用,提高了流数据的并发读写的效率。
在本发明实施例中,优选地,所述将流数据循环顺次写入由多个数据队列构建的存储区的一种实现方式为,顺次向各个数据队列写入设定的数据时长的流数据。
具体而言,可以为各数据队列设定可以写入的流数据的数据时长,当向一个数据队列中写入流数据达到该数据队列设定的数据时长时,转向下一个数据队列写入流数据。具体可以设定任意适用的时长作为写入的流数据的数据时长,本实施例对此不做限定。例如,设定每个数据队列中可以写入播放时长为5秒的视频流数据,在顺次写入各个数据队列时,一个数据队列中写入5秒的视频流数据后,就转向下一个数据队列开始写入,以此方式循环顺次写入存储区。
在本发明实施例中,优选地,所述预估当前写入数据队列之后的预备写入数据队列为待读取数据队列的一种实现方式为,判断当前时间距离待读取数据队列的起始写入时间是否超出第一时间阈值;若是,则确定当前写入数据队列之后的预备写入数据队列可能为待读取数据队列,所述第一时间阈值为除去一个数据队列之外其他队列的时间长度的总和。
具体而言,每个数据队列在写入流数据时记录有起始写入时间,第一时间阈值为除去一个数据队列之外其他队列的时间长度的总和。例如一共有7个数据队列,每个数据队列中存储有5秒的数据时长的流数据,那么第一时间阈值为5乘以6等于30秒。
在读取流数据时,判断当前时间减去待读取数据队列的起始写入时间是否超过第一时间阈值,如果超过了第一时间阈值,那么确定当前写入数据队列之后的预备写入数据队列可能为待读取数据队列。
在本发明实施例中,优选地,所述从所述存储区读取流数据的一种实现方式为,按照数据队列的队列标识顺次从各个数据队列读取流数据。
具体而言,数据队列的队列标识是指为数据队列设置的标识,例如队列编号。按照数据队列的队列标识顺次从各个数据队列读取流数据,例如读取完第1个数据队列的流数据后,读取第2个数据队列的流数据,以此方式实现顺次从各个数据队列读取流数据。
参照图2,示出了根据本发明实施例二的一种流数据的并发读写方法的步骤流程示意图,具体可以包括如下步骤:
步骤201,将流数据循环顺次写入由多个数据队列构建的存储区。
步骤202,从所述存储区读取流数据时,预估当前写入数据队列之后的预备写入数据队列为待读取数据队列。
步骤203,查找存储有最新流数据的第一目标数据队列。
在本发明实施例中,将存储有最新流数据的数据队列作为第一目标数据队列,具体查找存储有最新流数据的数据队列的方式可以有多种,具体采用的方式,本发明实施例对此不作限定。例如,可以查找起始写入时间距离当前时间最近的数据队列,或者可以查找流数据写入线程正在写入的数据队列。
在本发明实施例中,优选地,所述查找存储有最新流数据的第一目标数据队列的一种实现方式为,提取各个数据队列的起始写入时间;查找起始写入时间距离当前时间最近的数据队列为第一目标数据队列。
提取各个数据队列的起始写入时间,查找与当前时间最近的起始写入时间对应的数据队列,该数据队列中存储有最新的流数据,可以作为第一目标数据队列。
在本发明实施例中,优选地,所述查找存储有最新流数据的第一目标数据队列的一种实现方式为,调用流数据读取线程访问流数据写入线程;接收流数据写入线程反馈的最新流数据的第一目标数据队列的队列标识。
具体而言,流数据读取线程可以有多个,调用需要查找存储有最新流数据的第一目标数据队列的流数据读取线程,建立与流数据写入线程的通信,请求流数据写入线程反馈最新流数据的数据队列的队列标识,接收流数据写入线程反馈的最新流数据的第一目标数据队列的队列标识,以供根据队列标识找到对应的第一目标数据队列。
在本发明实施例中,优选地,所述方法还包括:在将流数据写入某一数据队列后,对设定位置记录的最新队列进行更新;所述查找存储有最新流数据的第一目标数据队列包括:在所述设定位置查找存储有最新流数据的最新队列。
具体而言,在设定位置记录最新队列,在流数据写入某一数据队列后,对记录的最新队列进行更新,例如,可以根据写入线程写入的数据队列,在设定位置记录最新队列的标识,以供读取线程到设定位置查找该标识。
从记录存储有最新流数据的数据队列的设定位置查找最新队列,作为第一目标数据队列。
步骤204,读取查找的第一目标数据队列。
从第一目标数据队列中读取流数据,可以从第一目标数据队列上当前写入的位置后的任意位置开始读取流数据,例如,从第一目标数据队列的起始位置开始读取流数据,或者从查找的最新画面组开始读取流数据。具体可以是第一目标数据队列上任意适用的位置开始读取流数据,本实施例对此不做限定。
在本发明实施例中,优选地,在所述读取查找的第一目标数据队列之前,所述从待读取数据队列转向读取流数据更新的第一目标数据队列还包括:查找所述第一目标数据队列中的最新画面组;所述读取查找的第一目标数据队列的一种实现方式是:在所述第一目标数据队列中,从所查找的最新画面组开始读取流数据。
具体而言,画面组是指视频中一组连续的画面,本实施例中,最新画面组为最新写入的一组完整的画面组,在读取查找的第一目标数据队列之前,查找第一目标数据队列中的最新画面组,例如,可以访问流数据写入线程,查找最新写入的一组完整的画面组。查找最新画面组可以采用任意适用的方法,本实施例对此不做限定。
在第一目标数据队列中,从查找的最新画面组开始读取流数据。由于在视频解码时只能解码完整的画面组来播放,所以读取最新的流数据需要从最新的一个画面组开始。
在本发明实施例中,优选地,在所述查找所述第一目标数据队列中的最新画面组之后,包括:查找所述第一目标数据队列中的最新画面组的I帧;所述在所述第一目标数据队列中,从所查找的最新画面组开始读取流数据包括:在所述第一目标数据队列中,从所查找的最新画面组的I帧开始读取流数据。
MPEG(Moving Picture Experts Group,动态图像专家组)标准编码将画面(即帧)分为I、P、B三种,I是内部编码帧,P是前向预测帧,B是双向内插帧。简单地讲,I帧是一个完整的画面,而P帧和B帧记录的是相对于I帧的变化。没有I帧,P帧和B帧就无法解码。
具体而言,在查找第一目标数据队列中的最新画面组之后,查找第一目标数据队列中最新画面组的I帧,之后在在第一目标数据队列中,从所查找的最新画面组的I帧开始读取流数据。
综上所述,依据本发明实施例,通过将流数据循环顺次写入由多个数据队列构建的存储区,从所述存储区读取流数据时,预估当前写入数据队列之后的预备写入数据队列为待读取数据队列,查找存储有最新流数据的第一目标数据队列,读取查找的第一目标数据队列,使得可以通过在预估到预备写入数据队列为待读取数据队列情况下,转向读取流数据最新的数据队列,防止当前写入数据队列被写满后,转到预备写入数据队列,也就是待读取数据队列开始写入,避免出现待读取数据队列中的流数据被写入操作所删除或覆盖的情况发生,相比通过锁操作的方式控制并发读写,降低了流数据并发读写时的处理器资源占用,提高了流数据的并发读写的效率。
进一步,转向读取流数据最新的数据队列既可以满足视频直播应用的直播需求,又可以使待读取数据队列和预备写入数据队列的距离最远,减小了再次转向第一目标数据队列读取流数据的可能性,以使读取的流数据可以连续不中断,实现流数据的播放流畅。
参照图3,示出了根据本发明实施例三的一种流数据的并发读写方法的步骤流程示意图,具体可以包括如下步骤:
步骤301,接收从另一传输节点推送至当前传输节点的流数据。
在本发明实施例中,一个传输节点可以主动或根据请求向另一个传输节点推送流数据,接收从另一个传输节点推送至当前传输节点的流数据。
步骤302,由流数据写入线程将流数据循环顺次写入由多个数据队列构建的存储区。
在本发明实施例中,流数据写入线程是指传输节点上可以将流数据写入存储区建立的线程。在接收到流数据后,又流数据写入线程将流数据循环顺次写入由多个数据队列构建的存储区。
步骤303,接收从当前传输节点对流数据的读取请求。
在本发明实施例中,当前传输节点对流数据的读取请求是指在当前传输节点根据流数据传输请求向存储区读取流数据的请求。接收当前传输节点对流数据的读取请求。
步骤304,由流数据读取线程从所述存储区读取流数据时,预估当前写入数据队列之后的预备写入数据队列为待读取数据队列。
在本发明实施例中,在流数据读取线程从存储区读取流数据时,预估当前写入数据队列之后的预备写入数据队列为待读取数据队列。具体实现方式与其他实施例描述一致,不再赘述。
步骤305,从待读取数据队列转向读取流数据更新的第一目标数据队列。
在本发明实施例中,优选地,所述方法还包括:在读取前一数据队列时,根据最后读取的流数据预估下一个读取的流数据;判定待读取的下一数据队列的第一个流数据并非预估的流数据时,从所述待读取的下一数据队列转向读取除待写入的下一数据队列之外的第二目标数据队列。
具体而言,在读取前一数据队列时,根据最后读取的流数据,预估下一个流数据,其中预估的流数据与最后读取的流数据可以组成连续的流数据,例如,可以给每个数据队列中存储的流数据进行编号,当读取完数据队列的最后一个流数据,预估的流数据的编号应该是当前正在读取的数据队列中流数据的编号的下一个。具体预估下一个流数据的方式可以采用任意适用的方式,本发明实施例对此不做限制。
在读取完一个数据队列中的流数据时,判断下一待读取的数据队列中的流数据并非预估的流数据时,也就是下一数据队列中流数据已经被更新的流数据所覆盖,从待读取的下一数据队列转向读取第二目标数据队列,其中第二目标数据队列为除待写入的下一数据队列之外的数据队列。
例如,此时7个数据队列中,从第1个数据队列到第7个数据队列,分别为其中存储的流数据进行编号,第1个数据队列中存储着第8组流数据,第2个数据队列中存储着第9组流数据,在读取完第1个数据队列中的第8组流数据后,预估下一个读取的流数据为第9组流数据的第一个,如果此时第2个数据队列中的第9组流数据被第16组流数据所覆盖,那么判定待读取的第2个数据队列的第一个流数据并非预估的第9组流数据时,转向读取第二目标数据队列。
在本发明实施例中,优选地,所述从所述待读取的下一数据队列转向读取除待写入的下一数据队列之外的第二目标数据队列包括:查找起始写入时间距离当前时间未超出第二时间阈值的任一第二目标数据队列,所述第二时间阈值为除去一个数据队列之外其他队列的时间长度的总和。
具体而言,每个数据队列在写入流数据时记录有起始写入时间,第二时间阈值为除去一个数据队列之外其他队列的时间长度的总和。例如一共有7个数据队列,每个数据队列中存储有5秒的数据时长的流数据,那么第二时间阈值为5乘以6等于30秒。
在读取流数据时,判断当前时间减去待读取数据队列的起始写入时间是否超过第二时间阈值,如果超过了第二时间阈值,那么从所述待读取的下一数据队列转向读取除待写入的下一数据队列之外的第二目标数据队列。
在本发明实施例中,优选地,所述从所述待读取的下一数据队列转向读取除待写入的下一数据队列之外的第二目标数据队列包括:从所述待读取的下一数据队列转向读取存储有最新流数据的第二目标数据队列。
具体而言,将存储有最新流数据的数据队列作为第二目标数据队列,具体查找存储有最新流数据的数据队列的方式可以有多种,具体采用的方式,本发明实施例对此不作限定。例如,可以查找起始写入时间距离当前时间最近的数据队列,或者可以查找流数据写入线程正在写入的数据队列。
从待读取的下一数据队列转向读取存储有最新流数据的第二目标数据队列,可以从第二目标数据队列上当前写入的位置后的任意位置开始读取流数据,例如,从第二目标数据队列的起始位置开始读取流数据,或者从查找的最新画面组开始读取流数据。具体可以是第二目标数据队列上任意适用的位置开始读取流数据,本实施例对此不做限定。
在本发明实施例中,优选地,所述由流数据读取线程从所述存储区读取流数据包括:记录当前读取的数据队列的队列标识和流数据的位置标识;推算下一个读取的流数据的位置标识和队列标识,并进行读取。
具体而言,队列标识是指为数据队列设置的标识,例如队列编号,位置标识是指数据队列中为流数据存储位置设置的标识,例如位置编号。在流数据读取线程从存储区读取流数据时,记录当前读取的流数据所在数据队列的队列标识,以及流数据的位置标识。用记录的队列标识和位置标识,推算下一句读取的流数据的位置标识和队列标识,并从对应的数据队列的对应的位置读取流数据。
综上所述,依据本发明实施例,通过接收从另一传输节点推送至当前传输节点的流数据,由流数据写入线程将流数据循环顺次写入由多个数据队列构建的存储区,实现了将另一个传输节点推送的流数据写入当前传输节点的存储区,以供其他传输节点或客户端从当前传输节点请求时读取。
进一步,通过接收从当前传输节点对流数据的读取请求,由流数据读取线程从所述存储区读取流数据时,预估当前写入数据队列之后的预备写入数据队列为待读取数据队列,从待读取数据队列转向读取流数据更新的第一目标数据队列,使得可以通过在预估到预备写入数据队列为待读取数据队列情况下,转向读取流数据最新的数据队列,防止当前写入数据队列被写满后,转到预备写入数据队列,也就是待读取数据队列开始写入,避免出现待读取数据队列中的流数据被写入操作所删除或覆盖的情况发生,相比通过锁操作的方式控制并发读写,降低了流数据并发读写时的处理器资源占用,提高了流数据的并发读写的效率。
参照图4,示出了根据本发明实施例四的一种流数据的并发读写装置的结构框图,具体可以包括如下模块:
流数据写入模块401,用于将流数据循环顺次写入由多个数据队列构建的存储区;
预估模块402,用于从所述存储区读取流数据时,预估当前写入数据队列之后的预备写入数据队列为待读取数据队列;
第一队列读取模块403,用于从待读取数据队列转向读取流数据更新的第一目标数据队列。
优选地,所述流数据写入模块,具体用于顺次向各个数据队列写入设定的数据时长的流数据。
优选地,所述预估模块包括:
第一判断子模块,用于判断当前时间距离待读取数据队列的起始写入时间是否超出第一时间阈值;
第一确定子模块,用于若是,则确定当前写入数据队列之后的预备写入数据队列可能为待读取数据队列,所述第一时间阈值为除去一个数据队列之外其他队列的时间长度的总和。
优选地,所述第一队列读取模块包括:
第一查找子模块,用于查找存储有最新流数据的第一目标数据队列;
第一读取子模块,读取查找的第一目标数据队列。
优选地,所述第一查找子模块包括:
写入时间提取子单元,用于提取各个数据队列的起始写入时间;
第一查找子单元,用于查找起始写入时间距离当前时间最近的数据队列为第一目标数据队列。
优选地,所述第一查找子模块包括:
写入线程调用子单元,用于调用流数据读取线程访问流数据写入线程;
队列标识接收子单元,接收流数据写入线程反馈的最新流数据的第一目标数据队列的队列标识。
优选地,所述装置还包括:
最新队列更新模块,用于在将流数据写入某一数据队列后,对设定位置记录的最新队列进行更新;
所述第一查找子模块,具体用于在所述设定位置查找存储有最新流数据的最新队列。
优选地,所述第一队列读取模块还包括:
画面组查找子单元,用于在所述读取查找的第一目标数据队列之前,查找所述第一目标数据队列中的最新画面组;
所述第一读取子模块,具体用于在所述第一目标数据队列中,从所查找的最新画面组开始读取流数据。
优选地,所述装置还包括:
帧查找子模块,用于在所述查找所述第一目标数据队列中的最新画面组之后,查找所述第一目标数据队列中的最新画面组的I帧;
所述第一读取子模块,具体用于在所述第一目标数据队列中,从所查找的最新画面组的I帧开始读取流数据。
优选地,所述装置还包括:
流数据预估模块,用于在读取前一数据队列时,根据最后读取的流数据预估下一个读取的流数据;
第二队列读取模块,用于判定待读取的下一数据队列的第一个流数据并非预估的流数据时,从所述待读取的下一数据队列转向读取除待写入的下一数据队列之外的第二目标数据队列。
优选地,所述第二队列读取模块包括:
第二查找子单元,用于查找起始写入时间距离当前时间未超出第二时间阈值的任一第二目标数据队列,所述第二时间阈值为除去一个数据队列之外其他队列的时间长度的总和。
优选地,所述第二队列读取模块,具体用于从所述待读取的下一数据队列转向读取存储有最新流数据的第二目标数据队列。
优选地,所述装置还包括:
流数据接收模块,用于在所述将流数据循环顺次写入由多个数据队列构建的存储区之前,接收从另一传输节点推送至当前传输节点的流数据;
所述装置还包括:
读取请求接收模块,用于在所述从所述存储区读取流数据之前,接收从当前传输节点对流数据的读取请求。
优选地,所述流数据写入模块,具体用于由流数据写入线程将流数据循环顺次写入由多个数据队列构建的存储区;
所述预估模块包括:
线程读取子模块,用于由流数据读取线程从所述存储区读取流数据。
优选地,所述线程读取子模块包括:
标识记录子单元,用于记录当前读取的数据队列的队列标识和流数据的位置标识;
推算与读取子单元,用于推算下一个读取的流数据的位置标识和队列标识,并进行读取。
优选地,所述预估模块包括:
顺次读取子模块,用于按照数据队列的队列标识顺次从各个数据队列读取流数据。
综上所述,依据本发明实施例,通过将流数据循环顺次写入由多个数据队列构建的存储区,从所述存储区读取流数据时,预估当前写入数据队列之后的预备写入数据队列为待读取数据队列,从待读取数据队列转向读取流数据更新的第一目标数据队列,使得可以通过在预估到预备写入数据队列为待读取数据队列情况下,转向读取流数据更新的数据队列,防止当前写入数据队列被写满后,转到预备写入数据队列,也就是待读取数据队列开始写入,避免出现待读取数据队列中的流数据被写入操作所删除或覆盖的情况发生,相比通过锁操作的方式控制并发读写,降低了流数据并发读写时的处理器资源占用,提高了流数据的并发读写的效率。
在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的一种流数据的并发读写方法和装置中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
本发明还公开了A1、一种流数据的并发读写方法,包括:
将流数据循环顺次写入由多个数据队列构建的存储区;
从所述存储区读取流数据时,预估当前写入数据队列之后的预备写入数据队列为待读取数据队列;
从待读取数据队列转向读取流数据更新的第一目标数据队列。
A2、根据A1所述的方法,其中,所述将流数据循环顺次写入由多个数据队列构建的存储区包括:
顺次向各个数据队列写入设定的数据时长的流数据。
A3、根据A2所述的方法,其中,所述预估当前写入数据队列之后的预备写入数据队列为待读取数据队列包括:
判断当前时间距离待读取数据队列的起始写入时间是否超出第一时间阈值;
若是,则确定当前写入数据队列之后的预备写入数据队列可能为待读取数据队列,所述第一时间阈值为除去一个数据队列之外其他队列的时间长度的总和。
A4、根据A1所述的方法,其中,所述从待读取数据队列转向读取流数据更新的第一目标数据队列包括:
查找存储有最新流数据的第一目标数据队列;
读取查找的第一目标数据队列。
A5、根据A4所述的方法,其中,所述查找存储有最新流数据的第一目标数据队列包括:
提取各个数据队列的起始写入时间;
查找起始写入时间距离当前时间最近的数据队列为第一目标数据队列。
A6、根据A4所述的方法,其中,所述查找存储有最新流数据的第一目标数据队列包括:
调用流数据读取线程访问流数据写入线程;
接收流数据写入线程反馈的最新流数据的第一目标数据队列的队列标识。
A7、根据A4所述的方法,其中,所述方法还包括:
在将流数据写入某一数据队列后,对设定位置记录的最新队列进行更新;
所述查找存储有最新流数据的第一目标数据队列包括:
在所述设定位置查找存储有最新流数据的最新队列。
A8、根据A4所述的方法,其中,在所述读取查找的第一目标数据队列之前,所述从待读取数据队列转向读取流数据更新的第一目标数据队列还包括:
查找所述第一目标数据队列中的最新画面组;
所述读取查找的第一目标数据队列包括:
在所述第一目标数据队列中,从所查找的最新画面组开始读取流数据。
A9、根据A8所述的方法,其中,在所述查找所述第一目标数据队列中的最新画面组之后,包括:
查找所述第一目标数据队列中的最新画面组的I帧;
所述在所述第一目标数据队列中,从所查找的最新画面组开始读取流数据包括:
在所述第一目标数据队列中,从所查找的最新画面组的I帧开始读取流数据。
A10、根据A1所述的方法,其中,所述方法还包括:
在读取前一数据队列时,根据最后读取的流数据预估下一个读取的流数据;
判定待读取的下一数据队列的第一个流数据并非预估的流数据时,从所述待读取的下一数据队列转向读取除待写入的下一数据队列之外的第二目标数据队列。
A11、根据A10所述的方法,其中,所述从所述待读取的下一数据队列转向读取除待写入的下一数据队列之外的第二目标数据队列包括:
查找起始写入时间距离当前时间未超出第二时间阈值的任一第二目标数据队列,所述第二时间阈值为除去一个数据队列之外其他队列的时间长度的总和。
A12、根据A10所述的方法,其中,所述从所述待读取的下一数据队列转向读取除待写入的下一数据队列之外的第二目标数据队列包括:
从所述待读取的下一数据队列转向读取存储有最新流数据的第二目标数据队列。
A13、根据A1所述的方法,其中,在所述将流数据循环顺次写入由多个数据队列构建的存储区之前,所述方法还包括:
接收从另一传输节点推送至当前传输节点的流数据;
在所述从所述存储区读取流数据之前,所述方法还包括:
接收从当前传输节点对流数据的读取请求。
A14、根据A1所述的方法,其中,所述将流数据循环顺次写入由多个数据队列构建的存储区包括:
由流数据写入线程将流数据循环顺次写入由多个数据队列构建的存储区;
所述从所述存储区读取流数据包括:
由流数据读取线程从所述存储区读取流数据。
A15、根据A14所述的方法,其中,所述由流数据读取线程从所述存储区读取流数据包括:
记录当前读取的数据队列的队列标识和流数据的位置标识;
推算下一个读取的流数据的位置标识和队列标识,并进行读取。
A16、根据A1所述的方法,其中,所述从所述存储区读取流数据包括:
按照数据队列的队列标识顺次从各个数据队列读取流数据。
本发明还公开了B17、一种流数据的并发读写装置,包括:
流数据写入模块,用于将流数据循环顺次写入由多个数据队列构建的存储区;
预估模块,用于从所述存储区读取流数据时,预估当前写入数据队列之后的预备写入数据队列为待读取数据队列;
第一队列读取模块,用于从待读取数据队列转向读取流数据更新的第一目标数据队列。
B18、根据B17所述的装置,其中,所述流数据写入模块,具体用于顺次向各个数据队列写入设定的数据时长的流数据。
B19、根据B18所述的装置,其中,所述预估模块包括:
第一判断子模块,用于判断当前时间距离待读取数据队列的起始写入时间是否超出第一时间阈值;
第一确定子模块,用于若是,则确定当前写入数据队列之后的预备写入数据队列可能为待读取数据队列,所述第一时间阈值为除去一个数据队列之外其他队列的时间长度的总和。
B20、根据B17所述的装置,其中,所述第一队列读取模块包括:
第一查找子模块,用于查找存储有最新流数据的第一目标数据队列;
第一读取子模块,读取查找的第一目标数据队列。
B21、根据B20所述的装置,其中,所述第一查找子模块包括:
写入时间提取子单元,用于提取各个数据队列的起始写入时间;
第一查找子单元,用于查找起始写入时间距离当前时间最近的数据队列为第一目标数据队列。
B22、根据B20所述的装置,其中,所述第一查找子模块包括:
写入线程调用子单元,用于调用流数据读取线程访问流数据写入线程;
队列标识接收子单元,接收流数据写入线程反馈的最新流数据的第一目标数据队列的队列标识。
B23、根据B20所述的装置,其中,所述装置还包括:
最新队列更新模块,用于在将流数据写入某一数据队列后,对设定位置记录的最新队列进行更新;
所述第一查找子模块,具体用于在所述设定位置查找存储有最新流数据的最新队列。
B24、根据B20所述的装置,其中,所述第一队列读取模块还包括:
画面组查找子单元,用于在所述读取查找的第一目标数据队列之前,查找所述第一目标数据队列中的最新画面组;
所述第一读取子模块,具体用于在所述第一目标数据队列中,从所查找的最新画面组开始读取流数据。
B25、根据B24所述的装置,其中,所述装置还包括:
帧查找子模块,用于在所述查找所述第一目标数据队列中的最新画面组之后,查找所述第一目标数据队列中的最新画面组的I帧;
所述第一读取子模块,具体用于在所述第一目标数据队列中,从所查找的最新画面组的I帧开始读取流数据。
B26、根据B17所述的装置,其中,所述装置还包括:
流数据预估模块,用于在读取前一数据队列时,根据最后读取的流数据预估下一个读取的流数据;
第二队列读取模块,用于判定待读取的下一数据队列的第一个流数据并非预估的流数据时,从所述待读取的下一数据队列转向读取除待写入的下一数据队列之外的第二目标数据队列。
B27、根据B26所述的装置,其中,所述第二队列读取模块包括:
第二查找子单元,用于查找起始写入时间距离当前时间未超出第二时间阈值的任一第二目标数据队列,所述第二时间阈值为除去一个数据队列之外其他队列的时间长度的总和。
B28、根据B26所述的装置,其中,所述第二队列读取模块,具体用于从所述待读取的下一数据队列转向读取存储有最新流数据的第二目标数据队列。
B29、根据B17所述的装置,其中,所述装置还包括:
流数据接收模块,用于在所述将流数据循环顺次写入由多个数据队列构建的存储区之前,接收从另一传输节点推送至当前传输节点的流数据;
所述装置还包括:
读取请求接收模块,用于在所述从所述存储区读取流数据之前,接收从当前传输节点对流数据的读取请求。
B30、根据B17所述的装置,其中,所述流数据写入模块,具体用于由流数据写入线程将流数据循环顺次写入由多个数据队列构建的存储区;
所述预估模块包括:
线程读取子模块,用于由流数据读取线程从所述存储区读取流数据。
B31、根据B30所述的装置,其中,所述线程读取子模块包括:
标识记录子单元,用于记录当前读取的数据队列的队列标识和流数据的位置标识;
推算与读取子单元,用于推算下一个读取的流数据的位置标识和队列标识,并进行读取。
B32、根据B17所述的装置,其中,所述预估模块包括:
顺次读取子模块,用于按照数据队列的队列标识顺次从各个数据队列读取流数据。