专利名称:快速文件预分配与文件箱动态管理方法
技术领域:
本发明涉及一种快速文件预分配与文件箱动态管理方法,通过此方法可以 利用操作系统提供的文件系统接口预先生成一个超大的文件,在此文件中再实 现一个微型的文件系统,并对外提供一层文件服务接口。利用文件服务接口可 以高效的完成"新增"、"删除"、"修改"等操作,最后以达到快速存取数据及 不产生文件碎片的目的,属于多媒体技术领域。
背景技术:
随着科技的日新月异,视频监控市场也得到了飞速发展。视频监控以其直 观、方便、信息内容丰富而广泛应用于许多场合。近年来,随着互联网的大范 围普及,以及计算机、网络以及图像处理、传输技术的飞速发展,视频监控技 术也有长足的发展。视频监控已经渗透到教育、政府、娱乐场所、医院、酒店、 运动场馆、城市治安等多种领域。视频监控的硬软件设备一般如图1所示。
在一个部署了视频监控系统的内部网内,通常都部署了流媒体服务器、视 频采集点和视频客户端。视频采集点负责采集现场的视频数据,并且压縮成指 定的格式,如MPEG-4的数据发送给后台流媒体服务器。流媒体服务器主要承担 3个任务1、实时视频的播放,视频客户端通过连接流媒体服务器来收看实时 视频,此时流媒体服务器负责将视频数据分发给各个客户端;2、实时视频的录 像,在视频录像时,流媒体服务器负责将采集到的视频数据保存成标准的AVI
文件。并把文件存放在本地的文件系统中;3、录像视频的回放,在视频录像回 放时,流媒体服务器负责从本地文件系统中取出AVI文件,解析文件获取帧率、 总帧数及每帧的起始地址等信息,并按照帧率定时将帧数据发送给客户端软件, 由客户端软件进行播放。视频客户端软件通常用来进行多屏实时视频的集中监 控,录像计划的定制及录像回放等功能。由于所有的录像文件都存放在本地文件系统中,这样就有了一个问题如 何能够快速的分配录像数据空间?如何能够在客户需要回放录像的时候快速的 找到录像文件?如何能够在回放和录像时快速的读取和保存?目前是通过文件 系统提供的接口直接进行存取操作,即直接将每个录像都保存成一个文件,读 取记录时也只需按照录像编号读取同名的文件即可。但这种方法的缺点在于录 像文件是需要人来维护的,维护人员会定期将不需要的录像文件清理删除,这 样就会造成文件不停的增加删除,由于流媒体服务器基于WINDOWS操作系统, 而WINDOWS操作系统现在主要使用NTFS和FAT32等文件系统模式,而基于文件 系统的架构原因,如此频繁的操作最终会在文件系统中造成大量的文件碎片, 这些文件碎片会极大的限制服务器性能的发挥,特别对于文件操作的性能,流 媒体服务器使用这种方式进行录像,在使用了一段时间后服务器在录像及回放 时的性能会有很大的下滑。发明内容本发明的目的是提供一种快速文件预分配与文件箱动态管理方法,该方法 提供的各种操作能够高效的存取视频录像记录,使用该方法操作记录时也不会 在文件系统中产生任何文件碎片,并且文件系统中的文件碎片也不会对该方法 提供的各种操作的性能产生任何影响。为实现以上目的,本发明的技术方案是提供一种快速文件预分配与文件箱
动态管理方法,其特征在于,在流媒体服务器上以软件方式实现,软件是以。++ 语言编写,安装在Windows操作系统上,软件通过和NTFS文件系统及Windows API的配合,对上提供一层抽象的文件系统服务层,文件系统服务层提供了录 像记录操作的基本接口 ,使用这些接口能够始终高效且安全的存取录像数据, 并且不会在文件系统中产生文件碎片,其方法为步骤1.生成一个Windows的DLL,在DLL中输出如下函数Init、AddNew、Update、 Delete、 Find,其中,Init为初始化方法,即初始化文件箱;AddNew 代表新增一条记录;Update代表更新一条记录;Delete代表删除一条 记录;Find代表査找一条记录;步骤2.首先,实现初始化方法Init,调用初始化方法时完成如下工作(1) 预先生成一个大小为4GB的文件,具体方法为先调用fopen函数生 成一个空白文件;(2) 在预先生成的文件中产生至少一个文件箱 每一个文件由索引区和数据区两大部分构成,大小为2M,地址为0 200000H,索引区由索引头和索引表组成,索引头大小为 100个BYTE—, 地址为0 64H,索引头前9个BYTE为头标识,值是ASC码"INDEXHEAD", 4个BYTE为当前录像记录总数,其余的空间都做为保留位,索引表大小为 2097052BYTE,地址为65H 200000H,索引表以连续地址的方式存放了每条 索引,并且按照记录序列号的字符串以升序方式排序,整个索引表共能存 放41941条索引;索引表之后是数据区,数据区地址为200001H 100000000H,将数据区 划分为多个定长的数据块,每个数据块能且只能保存一条录像记录。每个数据 块的长度为5M,格式如下使用标志+记录序列号+数据长度+数据,"使用 标志"为此块数据是否被使用的标志,占1BYTE,如未使用为0,已使用为l; "记录序列号"就是录像的序列号,"数据长度"是录像数据的总长度,占4个 BYTE,数据就是录像的实际数据,整个数据区由首地址开始连续存放着多个数 据块,可以存放800条以上录像记录; 步骤3.进行"查询"、"新增"、"更新"、"删除"、(1) 查询Find方法实现如下 首先利用二分査找法在索引表中査找对应的录像序列号,如果找到录像序列号,则得到记录的实际地址,再从记录的地址读出数据头,根据使用情况和 数据长度就最终找到了实际录像数据,如果在索引表中没有找到录像序列号,则査找失败,返回空二分查找的基本思想是设R[l0W. . high]是当前的查找区间a) 首先确定该区间的中点位置;b) 然后将待査的K值与R[mid].key比较若相等,则査找成功并返回此 位置,否则须确定新的査找区间,继续二分査找,具体方法如下① 若R[mid].key〉K,则由表的有序性可知R[mid.. n]. keys均大于K,因 此若表中存在关键字等于K的结点,则该结点必定是在位置mid左边的 子表R[l.. mid-1]中,故新的查找区间是左子表R[l.. mid-l];② 类似地,若R[mid]. key〈K,则要査找的K必在mid的右子表R[mid+L . n] 中,即新的査找区间是右子表R[mid+l..n],下一次査找是针对新的査 找区间进行的;(2) 新增AddNew方法实现如下 首先利用二分查找法在索引表中査找对应的录像序列号。如果找到录像序列号,则返回新增失败,如果没有找到序列号,就计算此序列号在索引表中的 可以存放的地址,设为X,接着遍历数据段,査询数据段的使用情况,直到找 到一块未使用的数据段,找到未使用数据段后将录像数据保存在数据段的数据 部分,再改写数据头部分,改写使用状态为已使用,改写记录序列号和数据长度字段,接着,改写索引表,首先将前面得到的地址x后的所有索引数据向后移动50 Byte,再在X地址处插入新的记录的索引,填写索引的记录序列号和 记录地址,最后修改索引头,将记录总数加l;(3) 更新Update方法实现如下 首先利用二分查找法在索引表中査找对应的录像序列号,如果没有找到录像序列号,则返回更新失败,如果找到序列号,再获取索引中的记录地址,更 改地址的数据段和数据头就完成了更新操作;(4) 删除Delete方法实现如下 先利用二分査找法在索引表中査找对应的录像序列号,如果没有找到录像序列号,则返回删除失败,如果找到序列号,再获取索引中的记录地址和索引 的地址,更改地址对应的数据段的数据头,将使用标志改为未使用,再将索引 地址+ 50Byte后的所有索引表数据全部向前挪动50Byte,最后修改索引头, 将记录总数减l。本发明另外提供一套抽象的文件服务层,文件服务层提供文件操作的所有 方法,即"新增"、"修改"、"删除"、"读取"的操作;在频繁的新增删除且长 时间运行下不会产生大量的文件碎片,适用于在文件系统中需频繁操作文件, 且服务器无人值守,而长时间的运行后不会出现性能下降情形。本发明的优点是架构简单而清晰,只需投入少量的技术改造就能使得流媒 体服务器能够长期稳定、高效的运行。
图1为实时视频监控系统网络图;图2为预分配文件结构图图3为二分查找法程序流程示意图4为新增录像记录程序流程示意图;图5为删除录像记录程序流程示意图。
具体实施方式
以下结合附图和实施例对本发明作进一步说明。 实施例在实施中,我们设定实施的操作系统为Windows操作系统,使用单个的文 件做为文件箱,文件的长度为4GB,实施过程中主要用到了一些Windows API 函数进行文件处理,主要有fopen打开或者生成一个文件;fclose关闭一个文 件;fseek在文件中移动当前地址;fwrite在文件中写数据;fread在文件中 读数据;另外,我们的录像记录是以MPEG-4压縮的方式保存, 一般保存352*288, 帧率为12. 5的录像10分钟最多占用5M空间。我们的每一条录像记录都有一条 录像序列号与之对应,录像序列号是最大长度为40的字符串。在所有的录像记 录中,录像序列号必须保证唯一存在。 下面详细说明具体实现方法步骤1.生成一个Windows的DLL,在DLL中输出如下函数Init、AddNew、Update、 Delete、 Find,其中,Init为初始化方法,即初始化文件箱;AddNew代 表新增一条记录;Update代表更新一条记录;Delete代表删除一条记录; Find代表査找一条记录;步骤2.首先,实现初始化方法Init,调用初始化方法时完成如下工作(1) 预先生成一个超大的文件,具体方法为先调用fopen函数生成一个空 白文件,再调用fseek函数移动文件指针到地址IOOOOOOOOH。这样, 我们就得到了一个大小为4GB的文件;(2) 由于我们需要在新生成的文件中产生一个文件箱,所以我们需要以200610148339. 1说明书第7/10页预定的格式来格式化文件,文件的格式如图2所示 如图2所示,为预分配文件结构图,文件主要由索引区和数据区两大部分构成,索引区主要为了加快查询记录的速度而存在,大小为2M,地址为0 ~ 200000H,如图二所示,索引区由两部分组成,索引头和索引表,索引头大小为 100个BYTE,地址为0 64H,索引头前9个BYTE为头标识,值是ASC码 "INDEXHEAD",接着4个BYTE为当前录像记录总数,其余的空间都做为保留位, 索引表大小为2097052 BYTE,地址为65H 200000H,索引表以连续地址的方式 存放了每条索引,索引的格式如下记录序列号+记录地址+保留位,长度为 50 BYTE,记录序列号是相关告警记录的序列号,长度40BYTE,类型为字符类 型,这样,序列号就以最大长度为40 BYTE的字符串的方式使用。记录地址长 度4 BYTE,为此记录的数据段在文件中的起始地址,其余6 BYTE为保留位, 索引表存放索引的方式为连续存放,并且按照记录序列号的字符串以升序方式 排序,整个索引表共能存放41941条索引。索引表之后是数据区,数据区地址为200001H 100000000H,考虑到录 像记录的特殊性及为了防止碎片的出现,我们将数据区划分为多个定长的数据 块。每个数据块能且只能保存一条录像记录。如果录像记录过长就无法使用数 据块保存,而即使录像记录很短也会占用一整块数据块。每个数据块的长度为 5M,格式如下使用标志+记录序列号+数据长度+数据,"使用标志"为此块 数据是否被使用的标志,占1BYTE,如未使用为0,已使用为1。"记录序列号" 就是录像的序列号,"数据长度"是录像数据的总长度,占4个BYTE。数据就 是录像的实际数据。整个数据区由首地址开始连续存放着多个数据块,这样4G 的文件约可以存放800条录像记录。另外也可以考虑使用扩充方式,即生成多个4G的文件统一管理为一个逻辑 上的文件箱,文件箱的索引表放在第一个数据文件中,而数据区布置在多个文 件中,这样只需在每个索引中再增加一个数据文件的标号即可索引到数据块的 实际地址,通过这种方式,我们就可以利用多个文件存放更多的录像记录。 步骤3.进行"査询"、"新增"、"更新"、"删除"、(1) Find方法实现如下如图3所示,为二分查找法程序流程示意图,首先利用二分査找法在索引 表中査找对应的录像序列号。如果找到录像序列号,则得到记录的实际地址, 再从记录的地址读出数据头,根据使用情况和数据长度就最终找到了实际录像数据。如果在索引表中没有找到录像序列号,则査找失败,返回空。 二分査找的基本思想是设R[IOW. . high]是当前的査找区间(3) 首先确定该区间的中点位置。(4) 然后将待查的K值与R[mid]. key比较若相等,则査找成功并返 回此位置,否则须确定新的査找区间,继续二分査找,具体方法如下① 若R[mid].key〉K,则由表的有序性可知R[mid.. n]. keys均大于K,因 此若表中存在关键字等于K的结点,则该结点必定是在位置mid左边的 子表R[l.. mid-1]中,故新的査找区间是左子表R[l.. mid-1]。② 类似地,若R[mid]. key〈K,则要査找的K必在mid的右子表R[mid+1.. n] 中,即新的査找区间是右子表R[mid+l.,n]。下一次査找是针对新的査 找区间进行的。因此,从初始的査找区间R[l..n]开始,每经过一次与当前査找区间的中 点位置上的结点关键字的比较,就可确定査找是否成功,不成功则当前的查找 区间就縮小一半。这一过程重复直至找到关键字为K的结点,或者直至当前的 査找区间为空,即査找失败时为止。(2) AddNew方法的实现如图4所示,为新增录像记录程序流程示意图,首先利用二分查找法在索
引表中查找对应的录像序列号。如果找到录像序列号,则返回新增失败。如果没有找到序列号,就计算此序列号在索引表中的可以存放的地址,设为x。接 着遍历数据段,査询数据段的使用情况,直到找到一块未使用的数据段。找到 未使用数据段后将录像数据保存在数据段的数据部分,再改写数据头部分,改 写使用状态为已使用,改写记录序列号和数据长度字段。接着,改写索引表。首先将前面得到的地址X后的所有索引数据向后移动50 Byte,再在X地址处 插入新的记录的索引,填写索引的记录序列号和记录地址。最后修改索引头, 将记录总数加l。这样就完成了新增工作;(3) Update方法的实现 首先利用二分査找法在索引表中査找对应的录像序列号。如果没有找到录像序列号,则返回更新失败,如果找到序列号,再获取索引中的记录地址,更 改地址的数据段和数据头就完成了更新操作;(4) Delete方法的实现如图5所示,为删除录像记录程序流程示意图,先利用二分查找法在索引 表中査找对应的录像序列号。如果没有找到录像序列号,则返回删除失败。如 果找到序列号,再获取索引中的记录地址和索引的地址,更改地址对应的数据 段的数据头,将使用标志改为未使用。再将索引地址+ 50 Byte后的所有索 引表数据全部向前挪动50Byte。最后修改索引头,将记录总数减l。就完成了 记录的删除操作;由于记录的査询操作是基于索引表和二分査找法的,所以记录始终能够以 高性能的方式被査询。而记录的更新、删除等操作都首先基于査询操作,在高 性能的查询操作基础下可直接索引到数据段的起始地址,因此记录数据也能够 被高效的存取。而由于录像记录是存放在定长的数据块中,因此在操作过程中 不会产生碎片空间,所以即使长时间频繁的新增、删除记录也不再会对系统造 成性能影响。这样使用了文件箱系统的服务器就能够长时间的保持高效的操作 磁盘数据。
权利要求
1. 一种快速文件预分配与文件箱动态管理方法,其特征在于,在流媒体服务器上以软件方式实现,软件是以C++语言编写,安装在Windows操作系统上,软件通过和NTFS文件系统及Windows API的配合,对上提供一层抽象的文件系统服务层,文件系统服务层提供了录像记录操作的基本接口,使用这些接口能够始终高效且安全的存取录像数据,并且不会在文件系统中产生文件碎片,其方法为步骤1.生成一个Windows的DLL,在DLL中输出如下函数Init、AddNew、Update、Delete、Find,其中,Init为初始化方法,即初始化文件箱;AddNew代表新增一条记录;Update代表更新一条记录;Delete代表删除一条记录;Find代表查找一条记录;步骤2.首先,实现初始化方法Init,调用初始化方法时完成如下工作a)预先生成一个4 GB的文件,具体方法为先调用fopen函数生成一个空白文件;b)在预先生成的文件中产生至少一个文件箱每一个文件由索引区和数据区两大部分构成,大小为2M,地址为0~200000H,索引区由索引头和索引表组成,索引头大小为100个BYTE,地址为0~64H,索引头前9个BYTE为头标识,值是ASC码“INDEXHEAD”,4个BYTE为当前录像记录总数,其余的空间都做为保留位,索引表大小为2097052BYTE,地址为65H~200000H,索引表以连续地址的方式存放了每条索引,并且按照记录序列号的字符串以升序方式排序,整个索引表共能存放41941条索引;索引表之后是数据区,数据区地址为200001H~100000000H,将数据区划分为多个定长的数据块,每个数据块能且只能保存一条录像记录。每个数据块的长度为5M,格式如下使用标志+记录序列号+数据长度+数据,“使用标志”为此块数据是否被使用的标志,占1 BYTE,如未使用为0,已使用为1;“记录序列号”就是录像的序列号,“数据长度”是录像数据的总长度,占4个BYTE,数据就是录像的实际数据,整个数据区由首地址开始连续存放着多个数据块,可以存放800条以上录像记录;步骤3.进行“查询”、“新增”、“更新”、“删除”、(1)查询Find方法实现如下首先利用二分查找法在索引表中查找对应的录像序列号,如果找到录像序列号,则得到记录的实际地址,再从记录的地址读出数据头,根据使用情况和数据长度就最终找到了实际录像数据,如果在索引表中没有找到录像序列号,则查找失败,返回空二分查找的基本思想是设R[low..high]是当前的查找区间a)首先确定该区间的中点位置;b)然后将待查的K值与R[mid].key比较若相等,则查找成功并返回此位置,否则须确定新的查找区间,继续二分查找,具体方法如下①若R[mid].key>K,则由表的有序性可知R[mid..n].keys均大于K,因此若表中存在关键字等于K的结点,则该结点必定是在位置mid左边的子表R[1..mid-1]中,故新的查找区间是左子表R[1..mid-1];②类似地,若R[mid].key<K,则要查找的K必在mid的右子表R[mid+1..n]中,即新的查找区间是右子表R[mid+1..n],下一次查找是针对新的查找区间进行的;(2)新增AddNew方法实现如下首先利用二分查找法在索引表中查找对应的录像序列号。如果找到录像序列号,则返回新增失败,如果没有找到序列号,就计算此序列号在索引表中的可以存放的地址,设为X,接着遍历数据段,查询数据段的使用情况,直到找到一块未使用的数据段,找到未使用数据段后将录像数据保存在数据段的数据部分,再改写数据头部分,改写使用状态为已使用,改写记录序列号和数据长度字段,接着,改写索引表,首先将前面得到的地址X后的所有索引数据向后移动50 Byte,再在X地址处插入新的记录的索引,填写索引的记录序列号和记录地址,最后修改索引头,将记录总数加1;(3)更新Update方法实现如下首先利用二分查找法在索引表中查找对应的录像序列号,如果没有找到录像序列号,则返回更新失败,如果找到序列号,再获取索引中的记录地址,更改地址的数据段和数据头就完成了更新操作;(4)删除Delete方法实现如下先利用二分查找法在索引表中查找对应的录像序列号,如果没有找到录像序列号,则返回删除失败,如果找到序列号,再获取索引中的记录地址和索引的地址,更改地址对应的数据段的数据头,将使用标志改为未使用,再将索引地址+50 Byte后的所有索引表数据全部向前挪动50 Byte,最后修改索引头,将记录总数减1。
全文摘要
本发明涉及提供一种方法来高性能的存取视频录像记录。其特征在于,在流媒体服务器上以软件方式实现。软件是以C++语言编写,安装在Windows操作系统上。软件通过和NTFS文件系统及Windows API的配合,对上提供一层抽象的文件系统服务层,文件系统服务层提供了录像记录操作的基本接口,使用这些接口能够始终高效且安全的存取录像数据,并且不会在文件系统中产生文件碎片。本发明的优点是架构简单而清晰,只需投入少量的技术改造就能使得流媒体服务器能够长期稳定、高效的运行。
文档编号G06F17/30GK101211338SQ200610148339
公开日2008年7月2日 申请日期2006年12月29日 优先权日2006年12月29日
发明者马轶群 申请人:上海欣泰通信技术有限公司