说明书一种基于SAAS的出版物平台的海量数据读取方法
技术领域
本发明涉及一种基于SAAS的出版物平台的海量数据读取方法,特别涉及的是基于SAAS技术的图片读取技术。
背景技术
随着信息技术和传感器技术的飞速发展 ,现代遥感数据源不断丰富 ,使得遥感影像图的数据量从以前的几兆、几十兆增长到现在的几百兆 ,甚至是几 GB、几十 GB。在这种情况下 ,如果对图像文件的处理仍采用传统的方法 ,显然是不行的。一方面,计算机硬件环境的发展已经远远不能满足图像处理的需要;另一方面 ,传统的利用文件指针方式来读取图像文件的方法,只能正确读取文件前面 231 -1(约 2GB)字节 ,所以不能满足大于 2GB以上的影像文件的读取。本文是在笔者开发的中国海岸带及近海卫星遥感综合应用系统 (Max_Deskpro)过程中,结合对海量遥感影像进行处理的要求 ,根据实际提出的一种快速读取海量图像的方法。实现该方法的主要技术包括内存映射文件技术、动态构建影像金字塔、缓存技术、图像分块技术。
发明内容
一种基于SAAS的出版物平台的海量数据读取方法;本方法是利用内存映射文件,利用计算机的内存进行大量映射文件。内存映射文件在对文件进行读写操作的时候 , Win32 API和 MFC都提供了支持这些操作的函数和类 ,如 Win32 API的 WriteFile( ) , ReadFile( )和 MFC提供的 CFile类。这些函数在文件的数据量小于 ( 231 -1)字节的时候 ,在大多数场合是可以满足用户的需求。但是当文件的数据量大于 ( 231 -1)字节 (约 2GB)时候 ,就不能正确地使用 Seek( )函数定位到要读取数据的位置 ,这是因为 Seek( LONG Loff, UINT nFrom)函数提供的 Loff参数是 LONG型的 ,它最多支持 ( 231 -1)字节的偏移量。假如图像文件的数据量大于 2GB的话 ,就不能定位到 2GB以后的部分来读取数据。由于内存映射文件技术的主要函数都提供了两个 DWORD型参数来分别表示文件大小或偏移量的低 32Bits和高 32Bits,这两个参数加起来共 64Bits,因此它所支持的最大文件长度为 16EB( 264 -1字节 ),几乎可以满足对任何海量数据文件的处理。
下面对两个关键函数进行具体说明 :
HANDLE CreateFileMapping( HANDLE hFile,
LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
DWORD flProtect,
DWORD dwMaximumSizeHigh,
DWORD dwMaximumSizeLow,
LPCTSTR lpName);
该函数创建一个文件内存映射对象 ,以告知系统文件映射对象需要多大的物理存储器。由于内存映射文件的物理存储器实际上是本地硬盘上的一个文件,而不是从系统的页文件中分配的内存 ,所以 CreateFileMapping( )函数不分配进程的地址空间 ,不占用内存空间 ,因此在实际应用中通常是一次性把整个文件创建为内存映射对象。如果要把文件中的数据映射到进程的地址空间中 ,则需要调用 MapViewofFile( )函数。该函数的具体定义如下 :
LPVOID MapViewofFile(
HANDLE hFileMappingObject,
DWORD dwDesiredAccess,
DWORD dwFileoffsetHigh,
DWORD dwFileoffsetLow,
DWORD dwNumberofBytesToMap );
调用该函数后 ,访问文件中的数据 ,就如同它位于内存中一样 ,这样就省去了对文件执行I/O操作的时间 ,所以它比用 CFile类和 Win32API的 WriteFile( ) , ReadFile( )速度上要快得多。在使用该函数的时候 ,由于它的返回值 LPVOID是一个 32Bits的指针类型 ,所以在处理海量数据文件的时候 ,还要进行分块映射 ,并且一次映射到进程地址空间的数据量要小于 231 -1字节数。文件内存映射的开始位置 (即文件的偏移地址)还必须满足是操作系统分配粒度的整数倍 (通常操作系统的分配粒度是 64K)。
使用内存映射文件的一般步骤:
(1)首先利用函数CreateFile( )打开一个文件内核对象;
(2)执行 CreateFileMapping( )函数创建一个文件内存映射对象;
(3)运用MapViewofFile( )函数将整个文件的部分或者全部数据映射到内存中;
(4)利用UnmapViewofFile( )函数解除文件的内存映射;
(5)最后利用UnmapViewofFile释放句柄,否则会造成资源泄露。