海量日志入库

cherry_hit_tom 2013-02-04 03:48:02
日志目录下有10个日志文件,每个文件压缩后大约60M左右,文件后缀是.gz,如a.gz、b.gz等,文件中行的内容是id=2112112,email=xxx@163.com,等等其它,
id=2112112,email=xxx@163.com,等等其它,
id=2112112,email=xxx@163.com,等等其它,
id=2112112,email=xxx@163.com,等等其它,
id=2112112,email=xxx@163.com,等等其它,
id=2112112,email=xxx@163.com,等等其它,
id=2112112,email=xxx@163.com,等等其它,

现在是想把这个目录下的每个文件的所有内容insert到数据库中,数据库中的表,是通过email分表的,大约是log_1,log_2,一直到log_1000的分表的,请问下详细的解决方案,比如说怎么样能保证到每个文件在很快的时间内入库,使得脚本执行更有效率
先贴一段代码

<?php
error_reporting(E_ALL & ~E_NOTICE);
//接收参数
$mysql_host = XX.XX.XX.XX;
$mysql_user = XXX;
$mysql_pass = XX;
$mysql_port = 3306;
$mysql_db = 'test';
$table_pre = 'log_';
$gz_log_file = a.gz;
//脚本执行日志
$exec_log = '/data_log/record.txt';
file_put_contents ($exec_log,'*****************************************START***********************************'."\r\n",FILE_APPEND );
file_put_contents ($exec_log,'param is mysql_host='.$mysql_host.' mysql_user='.$mysql_user.' mysql_pass='.$mysql_pass.' mysql_port='.$mysql_port.' mysql_db='.$mysql_db.' table_pre='.$table_pre.' gz_log_file='.$gz_log_file.' start_time='.date("Y-m-d H:i:s")."\r\n",FILE_APPEND );
//读日志入库
$z_handle = gzopen($gz_log_file,'r');
$time_start = microtime_float();
$mysql_value_ary = array();
//链接数据库
$conn = mysql_connect("$mysql_host:$mysql_port",$mysql_user,$mysql_pass);
if (!$conn) {
file_put_contents ($exec_log,'Could not connect database error, error='.mysql_error()."\r\n",FILE_APPEND );
exit;
}
$selec_db = mysql_select_db($mysql_db);
if(!$selec_db){
file_put_contents ($exec_log,'select database error, database='.$mysql_db."\r\n",FILE_APPEND );
exit;
}
while(!gzeof($z_handle)){
$each_gz_line = gzgets($z_handle, 4096);
$line_to_array = explode("\t",$each_gz_line);
//过滤无效日志
if(!empty($line_to_array[3]) && !empty($line_to_array[2]) && !empty($line_to_array[4])){
$insert_value = "('".$line_to_array[3]."','".$line_to_array[2]."','".$line_to_array[1]."','".$line_to_array[4]."','".$line_to_array[0]."') ";
$insert_sql = "insert into $table_name (uid,email,ip,ctime) values $insert_value ";
$table_id = abs(crc32($line_to_array[2]) % 1000);
$table_name = $table_pre.$table_id;
$result = mysql_query($insert_sql);
if(!$result){
//如果插入错误,则记录日志
file_put_contents ($exec_log,'table_name='.$table_name.' email='.$line_to_array[2]."\r\n",FILE_APPEND );
}
}
}
$time_end = microtime_float();
$diff = $time_end - $time_start;
file_put_contents ($exec_log,'success to insert database,log_file is '.$gz_log_file.' time-consuming is='.$diff."s \r\n",FILE_APPEND );
file_put_contents ($exec_log,'*******************************************END***********************************'."\r\n",FILE_APPEND );
gzclose($z_handle);

上面的代码执行起来,很慢,不可忍受,请大牛帮忙
...全文
502 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2013-02-05
  • 打赏
  • 举报
回复
历史数据入库,只是一次性工作。无所谓“效率” 你可以直接将文件导入 text 字段后,再由 update 指令拆分 如果不打算修改日志处理方式,那么将日志增量追加入库也只是一个定期工作(周期至少大于等于1天) 同样也没效率的概念
cherry_hit_tom 2013-02-05
  • 打赏
  • 举报
回复
合作方要求查询用户的行为日志,目前是把这些信息,先放到库里存的
xuzuning 2013-02-04
  • 打赏
  • 举报
回复
不知道为什么要放在数据库中 按你的描述,数据文件展开后,每个在 60*20M左右,甚至更高 你一条一条的插入,不慢才怪呢
总哈哈 2013-02-04
  • 打赏
  • 举报
回复
load data吧,load进去以后比对一下条数,别搞什么事务。出错几率很低的,即使出错了,删除以后重新导入也快。PS,这数据不叫海量数据。
yufulou 2013-02-04
  • 打赏
  • 举报
回复
对于innodb,开事物应该不会更慢,因为就算不开,每一条语句也都是一个事物,所以如果是只开启一个事物,最后commit一次,应该会比每条语句都begin一下,commit一下要快的(但我记得开了事物也不会快多少);但myisam在只有一个插入线程执行,并且表内总数据量比较小的场合下,肯定比innodb要快的,尤其是只有60M数据的环境下 load data infile 绝对会快很多,但你文件得先转换成另一个"xxx \t xxx"的形式,然后再load data infile,应该比一条条插入能快几倍
cherry_hit_tom 2013-02-04
  • 打赏
  • 举报
回复
楼上,用事务岂不是更慢吗
木目子 2013-02-04
  • 打赏
  • 举报
回复
表类型修改为:InnoDB,然后用事务实施, 还不行的话,换load file
cherry_hit_tom 2013-02-04
  • 打赏
  • 举报
回复
大家有没有好的解决方案啊?
内容概要:本文围绕“单相逆变器闭环逆变电路PWM模型仿真研究”展开,基于Simulink平台构建单相逆变器的闭环控制系统仿真模型,重点研究PWM调制技术在逆变电路中的应用与实现。文中详细阐述了系统架构设计、电压电流双闭环控制策略的实现原理、控制器参数设计及仿真建模全过程,并通过仿真结果验证了控制方案在动态响应、稳态精度与系统稳定性方面的有效性。同时,文档还涵盖多种电力电子系统典型应用场景,如多类型短路故障仿真(中性点不接地、经小电阻接地、经消弧线圈接地等)、软开关技术、微电网能量管理、MPPT控制等,体现出较强的技术综合性和工程实践价值。; 适合人群:电气工程、自动化、电力电子与新能源等相关专业的高校本科生、研究生、科研人员,以及从事电力系统仿真、逆变器设计与新能源并网技术研发的工程技术人员。; 使用场景及目标:①掌握基于Simulink的单相逆变器闭环控制系统建模与PWM仿真方法;②深入理解双闭环控制、SPWM/SVPWM调制、系统稳定性分析等核心技术原理;③为课程设计、毕业设计、科研项目或实际工程开发提供可复用的仿真模型与技术支持; 阅读建议:建议结合文中仿真模型动手实践,重点掌握PI控制器参数整定、PWM信号生成机制与仿真结果分析方法,同时可延伸学习文档中涉及的软开关、故障仿真、微电网控制等关联技术,以拓展系统级设计能力。

4,250

社区成员

发帖
与我相关
我的任务
社区描述
国内外优秀PHP框架讨论学习
社区管理员
  • Framework
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧