多进程并发项目案例

本文介绍了在某省建设银行省分行数据仓库项目中,如何利用多进程并发技术处理月末计算任务。通过硬件优化(多CPU、高内存、磁盘阵列)、数据库配置(非日志方式、大缓冲区、页锁)以及程序设计(按客户号划分进程,并发导入和计算)来提高效率。程序使用控制表完成流程控制,并演示了一个简化版的多进程调度代码。
摘要由CSDN通过智能技术生成
 

(1)项目说明

     该项目是笔者参与的某省建设银行省分行数据仓库项目,本节案例主要说明该项目的月末程序在多进程并发上的实现。下面是该案例的简要说明,以及该案例在硬件、数据库配置、数据库建库脚本、程序上调优的简要介绍。

    月末程序主要功能是计算各个客户的存款、贷款、消费、贡献度,然后按照指标把客户分成一系列的等级(如金卡、白金、银卡客户等),最后把优质客户分配给各个客户经理进行个性化营销。

     该项目月末模块计算量很大,但需要月末某天10小时内计算完成,所以需要利用软硬件上的各种性能。

     在硬件上,使用多CPU,高内存,磁盘阵列采用0+1方式,将表空间分布到不同的磁盘阵列上。在数据库管理配置上,使用非日志方式,同时把数据缓冲区配置相当大(总内存1/3至1/2)。在建表脚本上,将大表建立在多个表空间上发挥磁盘阵列的并发功能,同时数据块的配置应尽量大,使用大数据块能让磁盘阵列一次能顺序读出大量的数据页。建表脚本使用页锁而不使用行级锁。对于大数据量的处理在程序上处理优化也显得尤为重要,下面是程序优化的说明。

     该行客户信息表和存款表都有几千万级的数据量,所以单进程计算效率上是不允许的,只能用多进程并发。程序设计时取了最大客户号,按照定制进程数,将最大客户号/进程数划分客户号段分配给各进程,然后每个进程按照客户号范围并发将大表数据导入到十几个小表内,导入完后对小表建索引,然后利用十几个进程进行并发计算。

     由于月末处理程序划分为20多个子交易顺序完成,程序使用一个控制表来完成整个流程控制处理,支持每一步报错的重做功能。进程主控每次取控制表步骤号,调用每一步子主控函数,子主控函数fork十几个进程,然后进行功能函数处理,子主控函数等待各子进程退出,完成该步子交易处理后进程主控修改控制表步骤号并继续完成下一步。

     在以前OLTP的项目中,因为是查找少量数据,where子句上建索引可大幅提高查询性能,但这条规律并不适用OLAP项目。在并发分表时,由于各表都对客户号建了索引,分表时系统默认走索引,如把客户信息表分成17个表需要一个小时,但项目后期一次偶然机会,我使用数据库伪指令(SELECT --+FULL),进行全表扫描,结果客户信息表分表只用了20分钟。可见,实践出真知,思考出智慧,有时尝试一下新思路有时会有新的收获。

     在数据库使用方法上,大表一般重新由小表并发生成,然后建索引;锁方式设置为脏读,表数据更新后进行更新表的统计信息;处理完成后把原客户信息表、贡献度表等重命名,并发重新生成新的客户信息表、贡献度等表,生成新表后并发装载数据,然后再重建索引。

     应用要求fork进程数必须完成规定个数,一个报错要杀掉其他进程,主进程要等待该步所有子进程功能完成才能进行下一步程序。下面的demo代码为该月末程序简化的多进程调度部分。

 

(2)下面是多进程并发处理的demo程序</

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值