一..造数据要求
1.1 千万级数量
1.2 写进多个dbf文件,每个dbf文件关联两个sql文件-关联列为1.3的累加列
1.3 dbf文件两列全局唯一并累加,部分列随机生成
1.4 sql文件三列全局唯一并累加,部分列随机生成
需考虑情况有:cpu, 网络,磁盘io读写速度
二.实现方案
2.1串行执行
10w行数据
造一个dbf 和关联的sql1, sql2文件, 3分21秒 -- cpu占用12%(12%-win,linux环境为100%),左右(8核系统,单个cpu已占满)
2.2 多线程并行,线程锁锁住全局唯一变量
10w行数据
造2个dbf文件和他们关联的sql1,sql2文件, 时间 7分钟 -- 根据2.1中cpu占用属于正常时间
2.3 多进程并行,进程锁锁住全局唯一变量
10w行数据
造1个dbf文件+关联的sql1,sql2文件,时间7分05, ?--进程锁切换占用时间
造4个dbf文件+关联的sql1,sql2文件,时间12分06秒,
由于生成每行数据要请求一次锁,这种情况已不适合使用锁来分配全局唯一变量了,防止等待锁而影响了cpu性能充分的利用,采用2.4方案
2.4 多进程并行,不使用进程锁,按生成数据数量预分配每个进程使用 的全局唯一变量范围
10w行数据
造1个dbf文件+关联的sql1,sql2文件,时间3分39,
造4个dbf文件+关联的sql1,sql2文件,时间4分02秒, -- 4个python进程,每个占用12%左右(8核系统)
100w行数据
造4个dbf文件+关联的sql1,sql2文件,时间33分48秒 -- 符合预期
三.总结
3.1网络优化:
工具中获取环境账户信息与其他信息时需要网络请求服务器数据库内相关数据,
优化方式:第一次获取后缓存,后面造数据先查找缓存
3.2CPU利用优化:
多进程利用
3.3方案总结:
2.4为最优方案,同时创建多个dbf文件时,每个创建流程启动对应的进程,运行时每个进程占用12%cpu左右(8核系统已占满);单个进程内创建dbf,sql1,sql2文件是串行执行。
由于以上实践都以10w为实验,千万数据成倍数所需时间按倍数相乘即可大约35-40分钟
注:当创建文件数(进程数)超过系统核心数时,整体时间倍数于建单个文件的时间
例:
8核系统-10w行数据:
单个文件-3分钟,
同时创建1-8个文件 ~= 3分钟,
同时创建9-16个文件 ~= 6分钟
目前工具在数据时间为以上统计,受执行环境cpu性能和磁盘写速度影响,更换更高性能机器则时间更短。