大数据量生成脚本及导入策略

来源:互联网 发布:2015年进出口贸易数据 编辑:程序博客网 时间:2024/05/18 12:35

大数据量生成脚本及导入策略

分类: 测试 218人阅读 评论(1) 收藏 举报
shell数据库informix大数据脚本
性能测试过程中,如果需要构造一张表大数据量基础数据时,有两点需要注意:如何生成unl文件(此文件是后缀为.unl的数据文件,格式为,按表列分割的数据记录,例如:10001|33333|),生成的unl文件是否可以一次性导入到数据库相应表中。

为了方便叙述,假设数据库存在表test(id integer,name integer,primary key(id,name))。若想为此表导入1000W条记录,手动insert不现实,一般数据库系统都会提供特定指令,实现数据的导入导出操作,我们可以预先构造好相应格式的unl文件,再调用数据库导入指令,实现数据的快速导入。以Informix数据库为例,数据导入操作的命令为:load from testdata.unl insert into test;现在,剩下的问题就是如何生成一千万行的unl文件了。

了解shell脚本的同学会很快想到使用awk实现,这里也如大家所想,使用awk实现:
[plain] view plaincopy
  1. <span style="">#!/bin/sh  
  2. awk 'BEGIN{  
  3.     dbfile=sprintf("testdata.unl");  
  4.     for(i=0; i<1000; i++)  
  5.         {  
  6.             for(j=0;j<10000;j++)  
  7.             {  
  8.                 printf "100%05d|9%08d|\n",i,j >>dbfile  
  9.             }  
  10.             printf "%d completed.\n",i  
  11.         }  
  12. }' /dev/null</span>  

这样,会生成一个有1000W条记录的unl文件,于是我们兴冲冲使用“load from testdata.unl insert into test;”指令导入数据,结果发现报错了。因为一次性导入的数据太多,数据库系统的缓存、日志系统空间不够用,无法一次性记录太多的记录(或者因为操作时间太长,直接超时了“Long transaction aborted”)。

有两种解决方案:提高缓存、日志系统大小;缩小单个unl数据量。显而易见,后者更为合理。

如果将一千万的unl分成100小份,每份10W条,就好处理多了。脚本略作修改,如下:
[plain] view plaincopy
  1. <span style="">#!/bin/sh  
  2. awk 'BEGIN{  
  3.     for(i=0; i<100; i++)  
  4.         {  
  5.         dbfile=sprintf("mytable%02d.unl",i);  
  6.             for(j=0;j<100000;j++)  
  7.             {  
  8.                 printf "100%05d|9%08d|\n",i,j >>dbfile  
  9.             }  
  10.             printf "%d completed.\n",i  
  11.         }  
  12. }' /dev/null</span>  

此时,面对100个文件,要操作一百次,又有点头大。本着偷懒的原则,自然想到使用自动去做。于是,自动导入到test表中的shell脚本也新鲜出炉:
[plain] view plaincopy
  1. <span style="">#!/bin/sh  
  2. #生成100条的sql脚本  
  3. awk 'BEGIN{  
  4.     dbfile=sprintf("loadData.sql");  
  5.     for(i=0; i<100; i++)  
  6.     {  
  7.     printf "load from mytable%02d.unl insert into test;",i >>dbfile  
  8.     }  
  9.     printf "completed."  
  10. }' /dev/null  
  11.   
  12. #执行脚本  
  13. dbaccess mydatabank loadData.sql  
  14. </span>  

当然,如果想更深一步“偷懒”,可以把这些shell放一起,不过要注意可读性,建议再新建一个shell,顺序调用这两个shell,便于后续维护。