海量数据的解析和时间同步问题

本文介绍了一种使用Linux链表结构来解析和同步海量车辆加速度与GPS定位数据的方法。通过索引bin文件,将数据包解析并排序,最终实现同一时刻数据的组合,解决了数据包数量不一致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

已知条件:存在海量的车辆加速度和车辆定位信息,他们是单独存储成2种bin文件的形式,他们各自的bin文件存放的是不同时间段的数据项,现在需要将这些bin文件解析并且将同一时刻的数据做同步,即合成到一起显式出来。
PS:加速度和GPS的位置信息,每秒数据包的数量不一致,且相对于自身而言,每秒的数据包的数量也不一致。

环境

系统: Ubuntu 16.04
编译器: gcc version 5.4.0

思路

基于Linux 内核的list结构,创建一个链表用于存放数据包。
首先索引所有的bin文件,解析每一个bin文件,将bin文件中的数据包逐条解析出来,加入到链表中。
而后对链表的各个数据包按时间的顺序,从小到大进行排序。
最后,将取出时间相同的加速度和GPS的数据包将其组合到一起。比如,同一时刻,有5包加速度的数据,有7包GPS的数据,则只能同步成5包数据,多余的2包GPS数据丢弃。

Linux内核链表回顾

  1. list_head

    struct list_head {
    	struct list_head *next, *prev;
    };
    

    以上为内核链表的索引节点,对链表的增删改查都基于此节点。

  2. 创建头节点并初始化

    #define LIST_HEAD_INIT(name) { &(name), &(name) }
    #define LIST_HEAD(name) \
    struct list_head name = LIST_HEAD_INIT(name)
    static inline void INIT_LIST_HEAD(struct list_head *list){
    	list->next = list;
    	list->prev = list;
    }
    
  3. 创建自定义的链表节点

    struct list_node{
    	char *dataptr;
    	struct list_head node;
    }
    
  4. 一些其余的宏

    #define container_of(ptr, type, member) ({						\
    const typeof( ((type *)0)->member ) *__mptr = (ptr);			\
    (type *)( (char *)__mptr - offsetof(type, member) );})
    
    #define list_entry(ptr, type, member) 							\
    container_of(ptr, type, member)
    
    #define list_for_each_entry_safe(pos, n, head, member)			\
    for (pos = list_entry((head)->next, typeof(*pos), member),		\
    	n = list_entry(pos->member.next, typeof(*pos), member);		\
        &pos->member != (head); 									\
        pos = n, n = list_entry(n->member.next, typeof(*n), member))
    

    此处list_for_each_entry_safe的各个参数需要注意,pos为指向链表的自定义结构体的游标指针;n即也是一个指向链表自定义结构体的指针,他一只是指向pos的下一个节点;head是该链表的头节点;member指的是链表自定义节点中的list_head的变量名。
    list_entry一般用于通过head_list的指针,得到指向他所在自定义节点的指针,所以ptr是指向head_list的指针,type是自定义结构体的类型, member指的是链表自定义节点中的list_head的变量名。

排序

此次用到了选择排序,思想较为简单。

    list_for_each_entry_safe(iptr, next, &datalisthead, node){
        list_for_each_entry_safe(jptr, next, jhead, node){
            if(iptr->tv_sec < jptr->tv_sec){
			// swap list node value
            }
        }
        jhead = jhead->next;
    }

存储

即将链表中的节点遍历取出,将时间相同的元素存到一个数组中(数组元素的结构包含有时间,加速度和GPS数据),同时统计加速度和GPS各自的数量,当此时节点的时间和下一个节点的时间不一致时,则将数组的元素写入到文件中(按照加速度和GPS数量少的规则决定写入的数据的数量),而后清空该数组,直至所有的链表遍历完成,再销毁链表。

一、项目简介 本项目教程以国内电商巨头实际业务应用场景为依托,同时以阿里云ECS服务器为技术支持,紧跟数据主流场景,对接企业实际需求,对电商数仓的常见实战指标进行了详尽讲解,让你迅速成长,获取最前沿的技术经验。 二、项目架构 版本框架:Flume、DateHub、DataWorks、MaxCompute、MySql以及QuickBI等; Flume:数据领域被广泛运用的日志采集框架; DateHub:类似于传统数据解决方案中Kafka的角色,提供了一个数据队列功能。对于离线计算,DataHub除了供了一个缓冲的队列作用。同时由于DataHub提供了各种与其他阿里云上下游产品的对接功能,所以DataHub又扮演了一个数据的分发枢纽工作; 据上传下载通道,提供SQL及MapReduce等多种计算分析服务,同时还提供完善的安全解决方案; DataWorks:是基于MaxCompute计算引擎,从工作室、车间到工具集都齐备的一站式数据工厂,它能帮助你快速完成数据集成、开发、治理、服务、质量、安全等全套数据研发工作; QuickBI & DataV:专为云上用户量身打造的新一代智能BI服务平台。 三、项目场景 数仓项目广泛应用于数据领域,该项目技术可以高度适配电商、金融、医疗、在线教育、传媒、电信、交通等各领域; 四、项目特色 本课程结合国内多家企业实际项目经验。从集群规模的确定到框架版本选型以及服务器选型,手把手教你从零开始搭建基于阿里云服务器的数据集群。采用阿里云ECS服务器作为数据平台,搭建高可用的、高可靠的Flume数据采集通道,运用阿里云DateHub构建中间缓冲队列并担任数据分发枢纽将数据推送至阿里自主研发的DataWorks对数据进行分层处理,采用MaxCompute作为处理海量数据的方案,将计算结果保存至MySQL并结合阿里的QuickBI工作做最终数据展示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值