内存映射技术在大数据实时存储中的应用
2017-05-30刘平贾林林
刘平 贾林林
摘 要:大数据的高速实时存储是某图像采集设备研发过程中所要面对的一项问题,为了解决数据吞吐量大、系统并行处理任务多等问题,不进行数据缓冲存储以及文件I/O操作的内存映射文件正是解决多个进程间数据共享的最有效方法。结合某测控设备的实际研发,对内存映射技术的运行机制和具体实现流程进行进一步的研究,并针对实际情况进行特殊处理,以保证数据存储的实时性和稳定性。最后经过测控设备的实际测试,内存映射技术表现出良好的性能,满足系统数据存储方面的要求,而且相比较其他方式占用极少的物理资源,不会影响系统的性能。
关键词:内存映射;大数据;多线程;实时
中图分类号:TP311 文献标识码:A 文章编号:1003-5168(2017)03-0039-03
Abstract: The high-speed real-time storage of big data is a problem faced in the process of equipment research and development of an image acquisition, data throughput, in order to solve the problem of parallel processing system more tasks, not the data buffer storage and file I/O operation of the memory mapped file is the most effective method to solve the data sharing between multiple processes. Combined with the actual research for measurement and control equipment, the memory mapping technology operation mechanism and implementation process were further studied, and according to the actual situation of the special treatment to ensure the real-time and stability of data storage. The result of test and control equipment, memory mapping technology shows good performance, to meet the requirements of the data storage system, and compared with other means occupy very little physical resources, will not affect the performance of the system.
Keywords: memory mapping;large data;multithread;real-time
某128×128元圖像采集系统用于红外产品图像高速实时的连续处理,系统要求红外图像能够无差错地实时存储1h。按照产品每秒100帧频计算,1h的数据存储量大约为11.15GB,对于如此大数据量的存储,采用普通文件进行操作受限于Windows进程空间有限,无法实现4GB以上数据文件一次性存储。另外,基于文件I/O操作的普通文件操作,其存储速度慢,容易在此类实时性要求较高的系统中出现图像采集丢帧、显示速率不达要求、存储压力过大、运行可靠性低等问题,从而导致任务要求无法完成[1,2]。
通过设计专门的内存映射机制实现高速实时的红外图像实时存储,可以解决大数据量的实时存储问题。同时,该设计具备的高效率与高可靠性,也能够满足整个系统的其他要求。
1 内存映射存储特点
现在,一般采取内存映射技术完成大文件的实时存储操作。内存映射技术是Windows的一种内存管理方法。通过这种方式,在不占用额外的磁盘空间和内存空间条件下,就能实现目标磁盘文件与进程虚拟地址空间的对应关系。由于省去了数据缓冲存储及文件I/O操作,内存映射处理文件存储,速度很快而且能够一次性处理16EB(64位机)的数据量。
2 内存映射技术实现机制
内存映射文件与虚拟内存技术从本质上比较接近,两者虽然都是在磁盘空间内保留一定地址空间的区域用于完成大文件的存储,但是地址空间的性质有所不同,内存文件映射的物理存储器不是虚拟内存所采用的系统页文件,而是使用某个已经存在于磁盘上的文件,而且在对这个文件进行操作之前先期以一种类似于将文件整体从磁盘加载至内存的方式完成映射操作。
内存映射技术最大的优点在于,不对文件执行I/O操作就能处理存储于磁盘上的文件,这样做在数据处理的过程中将不需要为所有的文件重新申请并分配缓存,这类缓存操作将由系统直接进行管理,从而大大提高了系统的运行效率。
在处理大数据量的文件时,采用内存映射文件技术与其他数据存储方式相比,有其显而易见的优越性,因为在整个过程中将不再需要进行将文件数据加载至内存的操作,也不需要完成将数据从内存回写至文件和释放内存块等操作。
实际应用的系统很少采用单一线程模式运行,一般都是具有数据共享性质的多线程同时工作。共享的数据量小仍可以采取采取灵活多变的处理方式,但是如果共享数据的容量巨大,那么如果不使用内存映射文件技术而过多操作磁盘和内存,将会使系统资源不堪重负。从这一点来说,多线程数据共享处理方法首推内存映射文件技术。
3 内存映射技术运行流程
软件设计过程中,为了实现一次性存储大于4GB图像数据,并保证存储的实时性,应用内存映射文件处理方式来满足要求,并在映射中作了特殊处理保证存储的稳定性。图1给出了内存映射文件的流程图。
受Windows系统的限制,一个32位进程最大可分配4GB的虚拟地址空间,实际工程应用过程中不可能将大于这一容量的文件通过一次映射操作就完成存储。当需要處理的文件容量超过4GB时,就只能将此大文件的各个部分映射到进程的地址空间之后取消映射,然后重新映射文件的下一部分数据。这需要对上面的一般流程进行适当的更改,形成如图2的大文件内存映射流程图。
该函数中的主要参数说明:将要映射到进程的地址空间的文件句柄通过hfile参数指定,其就是之前CreateFile()函数得到的文件句柄。同时,当需要将存储器映射到进程的地址空间中时,系统首先确认物理存储器页面的应被赋予何种保护属性,而且该属性必须与CreateFile()函数打开文件时所指定的访问标识相匹配。
Windows可以采用64位值来进行文件操作,那么就需要划分一定大小的物理存储器空间用来存储内存映射文件,这时可以用2个重要参数“dwMaximumSizeHigh”与“dwMaximumSizeLow”分别指定内存映射文件内核对象大小的高32位值和低32位值。如果将其都设置为0,那么将为创建的“文件映射”内核对象保留与物理文件实际容量相同大小的区域。
关键问题是上面2个参数所指定的大小必须是系统最小分配粒度的整数倍,即64KB的整数倍。在某图像采集系统软件设计中图像数据一次性存储为12GB左右,因此设定15GB的存储空间,即2个参数分别为0x00000003和0xc0000000。
已经打开的内核对象需要在使用完毕之后通过CloseHandle()函数将其关闭,这与Win32的大多数对象相同。假如此时不进行关闭对象的操作,那么程序继续运行将出现资源泄露的现象。那么即使程序退出运行后操作系统会自动关闭在进程中打开而未关闭的任何对象,也会在随后的进程运行过程中必然不断积累过多的资源句柄。所以,通过CloseHandle()函数将那些不再使用的内核对象关闭是必须的。
4 存储效果及特殊处理
实际测试证明,进行大数据文件处理时采用内存映射文件技术具有很好的效果,系统可以能够稳定存储数据1h,满足设计要求。采用此处理方式与通常用CFile类和ReadFile()和WriteFile()等函数的方式相比对系统性能的影响微乎其微,因为其所消耗的物理资源极少。
由于实际应用中图像数据每次存储量均不同,可能仅有几秒钟的图像即数十兆的数据量,为了使存储满足按需分配,在结束存储时要进行特殊的处理。图4给出了实现此要求的主要步骤。
其中,以实际长度创建文件映射中将原文件映射的最终偏移量作为创建映射对象函数的内置参数,即创建了实际大小的文件映射对象。此外,要注意的是每次拷贝的数据量不能太大,最大不要超过进程的可分配地址空间2GB;也不要太小,以免拷贝次数太多,影响系统性能。在本图像采集系统软件设计中取320、640、800MB做试验,发现取640MB为一次拷贝运行良好,对系统性能无太大影响。
参考文献:
[1]张泽清.浅析Windows内存映射文件[J].福建师大福清分校学报,2006(2):20-25.
[2]吴志红,孙力,阎杰.高速红外图像实时采集存储与显示技术[J].红外技术,2003(5):56-59.