异构数据对比

  • 前阵子参加了一个比赛,编程方面是异构数据对比,特意记录回顾下当时比赛时整体的设计思路~
  • 赛题内容:两张表A与B,分别来源于两个数据库,表的大致内容应该是一样的,但是可能存在部分行内容(相同主键),部分的列字段内容不一样,需要挑出这些不同列,以及单属于A表的行,以及单属于B表的行
  • 比赛主要基于Python实现,程序设计时分为以下几个模块:
  1. GUI:主要是基于Thinker实现一个图形化操作。这个包其实挺容易上手的,里面内置了各种页面的不同物件,通过简单的物件 + 摆放 + 定义事件 即可实现有关程序的逻辑输入选择功能。主要做了以下几个页面:数据库选择页面,数据库配置页面,数据表的比较列选择页面,从而实现连接数据库,选择数据表进行比较等一系列操作。
  2. Database:主要是定义了一个Database父类,并且实现了 Mysql 以及 PostgreSQL的实现。内部主要有定义方法如从元数据库读取列信息,主键字段等。
  • 接下来是程序的核心部分:主要是Comparator,DataGenerator 以及 IOWriter。由于比赛要求的数据量是千万级别,以及结果的数据量未可知,所以当时DataGenerator和IOWriter主要是另起进程进行数据的加载以及写入操作。
  1. DataGenerator: 数据表的读取可以支持批量读取的操作。且每批量加载,由于数据会加载进python的进程,并且转换成tuple形式,所以会耗费一定量的时间。因为设计程序时希望相关的数据处理可以达成一个类似于pipeline数据流动加载的形式。这个进程内置了一个长度一定的队列,假设队列未满,即可向内部加载进新批次的数据
  2. Comparator:其与generator主要是通过python定义的进程间通信队列进行相关的通信。其计算加工过程:(1)加载进主键字段,即可通过set的交集以及差集操作计算共有的主键,以及单属于A,B表的主键内容 (2)batch load data,对于每批次加载的数据,可以直接筛选出单属于A,B表的内容,交给IO Writer输出结果。比较操作主要基于DataFrame的一系列操作,比如merge,其支持的列对比等。假设两边数据相同,则直接不管;两边数据不同,选取不同的列内容交给writer进行结果输出;当前未匹配到相同的内容,则交给下一批次进行结果处理。
  3. IOWriter:主要是考虑到结果数据集的大小未知,则单独起一个进程,进行结果输出。和comparator主要是通过进程间队列进行相互的通信。内部主要是设置了一个比较环节,每当数据集的数量达到一定值(比如30W),则进行结果输出。

比赛中也踩了很多bug,比较印象深刻的几个记录一下~

  1. Python也支持线程,Thread,一开始出于方便使用了很多多线程的操作,有很多线程 start join的操作,但是很快发现程序每个Batch都越跑越慢。这是因为thread结束,内存并不释放的缘故,因此这个操作应该是慎用的。
  2. 程序新启一个进程会传递一些初始参数,首先这是需要可以序列化的参数,例如数据库的连接这些就不可以。其次,应该注意这些参数的数据量大小。不同的线程可以访问同一内存区域,不同的进程拥有各自独立的内存区域,因此诸如进程的初始化,进程间的通信,这部分的数据都涉及到内存中的数据复制,因此需要控制其大小。
  3. 慎用DataFrame, 虽然这个有很多方便的数据操作,但是一旦数据转变,其内存占有量成百倍增加。慎用。
  4. 程序最后的时候发现一个很好玩的事情,笔记本电脑的内存是16G的内存,当时已经占满了内存,并且发现一些操作,其实数据量是恒定的,但是操作时间逐步增加,从开始的几秒到了后面的几十秒乃至一分钟。当时主要是一个计算交集差集的操作,猜测应该是由于内存占用过大,数据被移至swap区域,所以需要重新加载,因此时间增长。后来就把运算方式改变,更改为需要小的数据集(和较大的数据集做交集 变更为 和另一个较小的做差集),发现时间提升很多~

看了下别的参赛队伍的参赛作品简介,整理下别人家的做法:
5. 核心模块,比较环节,分而治之的思想,通过hash将主键分打给不同的线程处理,或者在读取数据的环节,分写入不同的小文件,这样即可保证同样主键的内容必然被分到一个线程中(或者说是写入小文件中),然后多线程操作并行小文件内进行数据比较。
6. 很多队伍也用到了数据有序的一个做法,比如是通过数据库的sort或者是数据库对于主键建立了索引,或者说是假设数据天然有序,这样进行比较的时候只需要游标移动到当前数据即可。
7. 别的队伍相对来说前期交互的设计(web页面)的确是更符合用户的使用体验,更为舒适;论坛提交的作品呈现,包括完整的程序流程,用户使用说明,重要代码展示,还有相关的软硬件配置,模块的性能参数的分析,可以说可以考虑的到方面都展示的很让人赏心悦目,值得好好学习,希望下次有这样的机会还是能尽善尽美地呈现~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值