遥感影像云存储方法与流程

文档序号:12470296阅读:985来源:国知局
遥感影像云存储方法与流程

本发明涉及遥感数据存储技术领域,尤其是一种基于HDFS的遥感影像存储方案。



背景技术:

遥感影像是各种传感器所获信息的产物,是遥感探测目标的信息载体。航天遥感技术经过多年的发展,无论在光谱分辨率、空间分辨率、时间分辨率等方面都有了长足的进步。但与此同时,遥感影像的数据规模陡然攀升,传统的单机存储系统已经无法满足需求:

1)单机存储系统无法承载如此大规模的影像数据,每天至少几TB的数据,单机硬盘会很快装满,这使得单机存储系统不易扩展的缺点暴露无遗;

2)更重要的是,单机存储系统的可靠性不易保证,当有硬盘出现故障时,其中的数据也随之丢失。

介于单机存储无法满足遥感影像大规模存储的现实情况,本发明提出了基于遥感影像常用库——GDAL与分布式文件系统——HDFS相结合的解决方案。

要实现本方案需要解决以下两点问题:

1)原生GDAL库不支持直接访问在HDFS上存储的影像;

2)GDAL要修改影像,需要对影像文件进行随机写,但HDFS不支持随机写。



技术实现要素:

本发明的目的在于克服现有技术中存在的不足,提供一种遥感影像云存储方法,基于GDAL与HDFS解决了遥感影像单机存储容量、可靠性不足的问题。本发明采用的技术方案是:

一种遥感影像云存储方法,包括下述步骤:

步骤S1,拓展GDAL文件访问接口,使GDAL能够读写HDFS上的影像;

步骤S2,提供一套本地缓存机制,即建立本地缓存,用于实现GDAL需要随机写的需要。

进一步地,步骤S1具体包括:

1)实现继承自VSIFilesystemHandler用以访问HDFS的文件系统访问类,调用libhdfs提供的函数,完成VSIFilesystemHandler中定义的文件系统访问接口;

2)在VSIFileManager中注册,即在VSIFileManager维护的映射表中加入一个新的键值对,新键值对的键为唯一标识HDFS文件系统访问句柄的字符串,键值为HDFS文件系统访问句柄。

进一步地,步骤S2具体包括:

对文件进行分块处理,每次从HDFS上按块读取存入本地缓存;所述本地缓存包括内存缓存和本地文件缓存;

采用LRU策略来协调内存缓存与本地文件缓存:

1)初始化内存缓存,内存缓存最多缓存N个文件块;

2)初始化本地文件缓存,即创建一个本地文件;

3)在内存缓存中维护一个LRU排序队列,最近用过的文件块排在LRU队列的队首,越久没有用到的文件块在队列中排得越靠后;

4)当内存缓存已满时,从LRU排序队列中进行淘汰,将最久没有使用过的文件块写入本地文件缓存,空出新的缓存载入新的文件块。

具体地,本地缓存机制的读文件块过程,包括以下步骤:

步骤S101,判断文件块是否在本地缓存中,若是则进行步骤S102,否则进行步骤S104;

步骤S102,判断文件块在内存缓存中还是在本地文件缓存中,若在本地文件缓存中进行步骤S103,若在内存缓存中进行步骤S109;

步骤S103,向本地文件缓存读取该文件块;转步骤S105;

步骤S104,向HDFS读取该文件块;

步骤S105,判断内存缓存是否有空的内存缓存块;若是转步骤S107,若否进行步骤S106;

步骤S106,将LRU队列中最末尾的文件块写入本地文件缓存,空出一个内存缓存块;

步骤S107,向该空内存缓存块中载入读取的文件块数据;

步骤S108,将经过步骤S107后的该内存缓存块排到LRU队列队首;

步骤S109,返回该内存缓存块中的数据。

具体地,本地缓存机制的写文件块过程,包括以下步骤:

步骤S201,判断是否要写整个文件块;若是则进行步骤S209,若否则进行步骤S202;

步骤S202,进一步判断文件块是否在本地缓存中,若是则进行步骤S204,若否则进行步骤S203;

步骤S203,向HDFS读取该文件块;

步骤S204,进一步判断文件块是否在内存缓存中,若是则进行步骤S211,若否则进行步骤S205;

步骤S205,向本地文件缓存读取该文件块;

步骤S206,判断内存缓存是否有空的内存缓存块;若是转步骤S208,若否进行步骤S207;

步骤S207,将LRU队列中最末尾的文件块写入本地文件缓存,空出一个内存缓存块;

步骤S208,向该空内存缓存块载入读取的文件块数据;转步骤S211;

步骤S209,判断内存缓存是否有空的内存缓存块;若是转步骤S211,若否进行步骤S210;

步骤S210,将LRU队列中最末尾的文件块写入本地文件缓存,空出一个内存缓存块;

步骤S211,向步骤S209或S210中的空内存缓存块写文件块数据;

步骤S212,将经过步骤S211后的该内存缓存块排到LRU队列队首。

本发明的优点在于:

1)本发明基于GDAL与HDFS解决了遥感影像单机存储容量、可靠性不足的问题;

2)拓展了GDAL文件访问接口,方便遥感影像在HDFS上的存取;

3)以本地缓存的方式实现了GDAL修改HDFS上影像文件的功能;

4)增加了本地缓存,在重复读的情形下,提高了GDAL读取HDFS影像文件的速度。

附图说明

图1为本发明的整体框架图。

图2为本发明的GDAL文件系统访问句柄继承关系图。

图3为本发明的GDAL文件访问部分结构示意图。

图4为本发明的读文件块流程图。

图5为本发明的写文件块流程图。

具体实施方式

下面结合具体附图和实施例对本发明作进一步说明。

如图1所示,遥感影像云存储方法,是一种基于遥感影像常用库——GDAL与分布式文件系统——HDFS相结合的解决方案;图1中的Cache是缓存;

本发明的目标是:

(一)拓展GDAL文件访问接口,使GDAL能够读写HDFS上的影像;

(二)提供一套本地缓存机制,即建立本地缓存,用于解决GDAL需要随机写,而HDFS不支持的问题;同时尽可能提高命中,提高读写速度;所述本地缓存包括内存缓存和本地文件缓存。

下面是本发明两个主要部分的详细描述;

(一)拓展GDAL文件访问接口;

作为遥感影像数据常用的图像处理库,GDAL主要包括以下四部分:

1)抽象数据结构。此部分定义了“GDAL影像”的属性,以及针对“GDAL图像”可以进行的基本操作;

2)图像格式解析器。GDAL打开图像文件时,通过此部分将不同格式的影像文件内容转换为内存中的“GDAL影像”;

3)图像处理算法。此部分包含了一些图像处理算法,如几何校正、RPC校正、坐标投影变换等;

4)文件访问部分。此部分定义了文件访问接口,用于访问不同“文件系统”上的“文件”。

要能操作HDFS上的文件,需要做的就是扩展GDAL的文件访问部分。GDAL文件访问部分的代码在GDAL源代码的port目录下。GDAL可以访问的各个文件系统都以VSIFilesystemHandler为基类的,各个文件系统的句柄由一个叫VSIFileManager的类管理着,其内部维护了一个以文件系统句柄唯一绑定的字符串(string)为键(key),文件系统句柄为键值(value)的映射表(map),这样当访问不同的文件系统时,可以根据不同的key值选取不同的文件系统句柄。VSIFilesystemHandler和VSIFileManager都是GDAL中的类(class);因此为完成本方案设计需要以下步骤:

1)实现继承自VSIFilesystemHandler用以访问HDFS的文件系统访问类,调用libhdfs提供的函数,完成VSIFilesystemHandler中定义的诸如文件系统打开、创建目录等文件系统访问接口;

2)在VSIFileManager中注册,即在VSIFileManager维护的映射表(map)中加入一个新的键值对,新键值对的键为唯一标识HDFS文件系统访问句柄的字符串(string),键值(value)为HDFS文件系统访问句柄。

GDAL文件系统访问句柄继承关系如图2所示,

GDAL文件访问部分结构示意如图3所示;

(二)本地缓存的实现;

由于HDFS不支持随机写,因此已存入HFDS的文件不能直接的进行修改。本发明的方案是,在本地建立缓存,只在本地缓存读到或写到的区域,在关闭文件时先同步未读到的区域,再写HDFS文件。

这样做有以下优点:

1)实现了GDAL直接修改HDFS中的影像文件;

2)在有重复读的情况时,减少了对HDFS的请求次数,提高了文件读取速度。

本发明对文件进行分块处理,每次从HDFS上按块读取存入本地缓存;本方案采取的是双缓存机制,即内存缓存和本地文件缓存协同构成本地缓存的机制。

从读写速度上讨论,内存缓存速度快于本地磁盘缓存,本地磁盘缓存快于直接读取HDFS文件,因此尽可能发挥内存缓存的速度优势有利于优化GDAL读写文件的速度。

本发明采用LRU策略来协调内存缓存与本地文件缓存,使内存缓存与本地文件缓存可以最大限度的满足需求,具体实施步骤如下:

1)初始化内存缓存,内存缓存可以最多缓存N个文件块;N≥1,是整数;

2)初始化本地文件缓存,即创建一个本地文件;

3)在内存缓存中维护一个LRU排序队列,最近用过的文件块排在LRU队列的队首,越久没有用到的文件块在队列中排得越靠后;

4)当内存缓存已满时,从LRU排序队列中进行淘汰,将最久没有使用过的文件块写入本地文件缓存,空出新的缓存载入新的文件块。

具体地,

读文件块流程如图4所示,包括:

步骤S101,判断文件块是否在本地缓存中,若是则进行步骤S102,否则进行步骤S104;

步骤S102,判断文件块在内存缓存中还是在本地文件缓存中,若在本地文件缓存中进行步骤S103,若在内存缓存中进行步骤S109;

步骤S103,向本地文件缓存读取该文件块;转步骤S105;

步骤S104,向HDFS读取该文件块;

步骤S105,判断内存缓存是否有空的内存缓存块;若是转步骤S107,若否进行步骤S106;

步骤S106,将LRU队列中最末尾的文件块写入本地文件缓存,空出一个内存缓存块;

步骤S107,向该空内存缓存块中载入读取的文件块数据;

步骤S108,将经过步骤S107后的该内存缓存块排到LRU队列队首;

步骤S109,返回该内存缓存块中的数据。

写文件块流程如图5所示,包括:

步骤S201,判断是否要写整个文件块;若是则进行步骤S209,若否则进行步骤S202;

步骤S202,进一步判断文件块是否在本地缓存中,若是则进行步骤S204,若否则进行步骤S203;

步骤S203,向HDFS读取该文件块;然后转步骤S206;

步骤S204,进一步判断文件块是否在内存缓存中,若是则进行步骤S211,若否则进行步骤S205;

步骤S205,向本地文件缓存读取该文件块;

步骤S206,判断内存缓存是否有空的内存缓存块;若是转步骤S208,若否进行步骤S207;

步骤S207,将LRU队列中最末尾的文件块写入本地文件缓存,空出一个内存缓存块;

步骤S208,向该空内存缓存块载入读取的文件块数据;转步骤S211;

步骤S209,判断内存缓存是否有空的内存缓存块;若是转步骤S211,若否进行步骤S210;

步骤S210,将LRU队列中最末尾的文件块写入本地文件缓存,空出一个内存缓存块;

步骤S211,向步骤S209或S210中的空内存缓存块写文件块数据;

步骤S212,将经过步骤S211后的该内存缓存块排到LRU队列队首。

向内存缓存块写过程结束后,再将内存缓存块中的数据推入(保存进)HDFS中;

步骤S202~S208所起的作用是,当要写的不是一个完整的文件块时,先要把它在HDFS或本地文件缓存中找到,然后调出该文件块,放入内存缓存的LRU队列的内存缓存块中,才可以对其进行修改。

本发明涉及的一些术语解释如下:

GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。

HDFS:Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统。

libhdfs是基于JNI的hdfs的C应用接口,它提供了通过C接口访问HDFS的功能。

LRU是Least Recently Used 近期最少使用算法。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1