本发明涉及大数据高效存储检索,尤其涉及一种海量ais船位数据的高效存储和检索方法。
背景技术:
1、ais技术在水上运输安全领域发挥了重要的作用,随着ais设备安装和应用的增长,全球ais设备播发的数据量日益增长,如何高效存储和检索这些海量ais历史船位数据,是业界普遍比较关注的核心技术能力。过往不乏采用比较流行的大数据框架,比如用基于hbase、clickhouse等存储和检索技术,的确在某一方面能够取得比较好的效果,如hbase的并行框架和良好的可扩展性,clickhouse出色的读写速度和计算资源利用率等,但其分别存在资源消耗较大且维护相对复杂、检索的并发性较弱等问题。
2、因此,在资源相对有限的情况下,如何在存储方案的设计上,综合考虑各方因素,达到存储空间、检索速度、并发性能等各方面之间取得一个平衡,最终达到利用相对较少的资源,获得所需的效果,是目前亟需解决的问题。
技术实现思路
1、本发明的目的在于提供一种海量ais船位数据的高效存储和检索方法,从而解决现有技术中存在的前述问题。
2、为了实现上述目的,本发明采用的技术方案如下:
3、一种海量ais船位数据的高效存储和检索方法,包括如下步骤,
4、s1、船位数据处理:
5、对实时接收的船位数据进行预处理,并对预处理后的船位数据进行筛选过滤后,将满足条件的船位数据暂存在计算机程序的内存中;
6、s2、船位数据写入redis:
7、对于暂存在计算机程序内存中的船位数据,根据相应的时间条件,利用管道pipeline方式将其写入到redis;
8、s3、船位数据转存到postgresql:
9、设置定时器,在适当的时刻将redis中缓存的船位数据使用dp算法抽稀后存储到postgresql中;
10、s4、高效读写存储方案:
11、利用postgresql的特点,根据船位数据的时序变化特征,设计高效读写的船位数据存储方案;
12、s5、基于mmsi和时间段的船位数据检索:
13、以mmsi和时间段为输入条件,根据实际情况直接在redis缓存中读取船位数据或者编写sql从postgresql中查询船位数据。
14、优选的,步骤s1具体包括如下内容,
15、s11、对实时接收的船位数据进行解码、去重、合规检查,以实现船位数据的预处理;
16、s12、在计算机程序中初始化收到的n个船位数据,判断该n个船位数据中是否存在跳点,若存在则舍弃这些船位数据,否则保留这n个船位数据;
17、s13、此后每接收到新的船位数据,则根据时间间隔及瞬时航速对其进行初步过滤,并根据存储资源设置最小存储间隔;
18、s14、对最近m个船位数据采用垂距限值算法进行过滤,以去除一些明显不影响轨迹变化特征的位置点;
19、s15、将经过上述步骤处理后确定需要保留的船位数据暂存在计算程序内存中;且在将船位数据成功写入redis之前,不提交kafka消费偏移量,避免处理程序意外退出而丢失数据。
20、优选的,预处后的船位数据包括,接收时间rcvtime、定位时间postime、经度longitude、纬度latitude、对地航速sog、航迹向cog、船艘向trueheading、航行状态navstatus、转向率rot、定位精度posaccuracy以及其它一些辅助信息。
21、优选的,步骤s2具体为,
22、对于存入计算程序内存中的船位数据,在积累一定数量或刷新时间间隔达到后,以mmsi加实时处理当日的utc零时刻时间戳为key,多个船位字符串的sorted sets类型值为value,生存时间ttl设置为24~48小时,用管道pipeline方式写入到redis。
23、优选的,在将船位数据写入到redis的过程中,对于船位数据字符串,采用特殊符号分割各信息域,对于空信息域,分割符号不能省略,以令每一个数组元素内部定义也是结构化的;信息域的表示方面,在不丢失信息内容的前提下,把某些信息域用相对值来表示,并以原始明文方式保存,以减少存储空间。
24、优选的,步骤s3具体为,
25、在当天utc零时刻加上一定时间达到后,从redis缓存中读取前一天的全部船位数据,并利用dp算法抽稀后存储到postgresql。
26、优选的,步骤s3中,利用多线程技术并行处理所有在redis缓存的该日船位数据,并在确保持久化到postgressql的磁盘成功以后,删除掉redis中对应的key,及时释放空间。
27、优选的,步骤s4具体为,
28、postgresql中,根据船位日期按月分区,以 mmsi和utc日期时间戳为联合主键,每天每个mmsi号码的所有船位数据写入到一维数组类型列,数组中每个元素标识一个船位数据字符串,该字符串以非数字字符分割每一个信息域。
29、优选的,postgresql提供了丰富的数组修改函数,能够对数据进行修改;
30、在将船位数据写入postgresql时,利用批量insert方案写入,以最大化写入速度;同时,定义整数类型列,用于存储每个mmsi每天的船位个数,以直观反映疏密程度。
31、优选的,步骤s5具体为,
32、对于近两天的船位数据,直接从redis缓存中读取;
33、对于两天前的船位数据,编写sql从postgresql中查询,此类查询不超过一个月;在船位数据的存储分区内,使用mmsi和utc零时刻时间戳的联合索引,快速定位到相关记录。
34、本发明的有益效果是:1、通过对船位数据进行预处理、筛选过滤等操作,丢弃不合理的船位数据,保证数据质量及轨迹线段的完整性。2、通过设计船位字符串,减少存储空间。3、利用批量写入的方式将船位数据批量存储在redis中,满足每秒万级的数据处理。4、数据转存时,采用多线程技术并行处理所有在redis缓存的数据,提高转存效率,并在转存成功后及时删除对应的key,释放redis中其占用的内存空间。5、设计高效读写的存储方案,减少海量ais船位轨迹数据占用的磁盘存储空间。6、利用用mmsi和utc零时刻时间戳的联合索引,快速定位相关记录,避免排序带来的cpu、内存开销。
1.一种海量ais船位数据的高效存储和检索方法,其特征在于:包括如下步骤,
2.根据权利要求1所述的海量ais船位数据的高效存储和检索方法,其特征在于:步骤s1具体包括如下内容,
3.根据权利要求1所述的海量ais船位数据的高效存储和检索方法,其特征在于:预处后的船位数据包括,接收时间rcvtime、定位时间postime、经度longitude、纬度latitude、对地航速sog、航迹向cog、船艘向trueheading、航行状态navstatus、转向率rot、定位精度posaccuracy以及其它一些辅助信息。
4.根据权利要求1所述的海量ais船位数据的高效存储和检索方法,其特征在于:步骤s2具体为,
5.根据权利要求4所述的海量ais船位数据的高效存储和检索方法,其特征在于:在将船位数据写入到redis的过程中,对于船位数据字符串,采用特殊符号分割各信息域,对于空信息域,分割符号不能省略,以令每一个数组元素内部定义也是结构化的;信息域的表示方面,在不丢失信息内容的前提下,把某些信息域用相对值来表示,并以原始明文方式保存,以减少存储空间。
6.根据权利要求1所述的海量ais船位数据的高效存储和检索方法,其特征在于:步骤s3具体为,
7.根据权利要求6所述的海量ais船位数据的高效存储和检索方法,其特征在于:步骤s3中,利用多线程技术并行处理所有在redis缓存的该日船位数据,并在确保持久化到postgressql的磁盘成功以后,删除掉redis中对应的key,及时释放空间。
8.根据权利要求1所述的海量ais船位数据的高效存储和检索方法,其特征在于:步骤s4具体为,
9.根据权利要求8所述的海量ais船位数据的高效存储和检索方法,其特征在于:postgresql提供了丰富的数组修改函数,能够对数据进行修改;
10.根据权利要求1所述的海量ais船位数据的高效存储和检索方法,其特征在于:步骤s5具体为,