加入收藏 | 设为首页 | 会员中心 | 我要投稿 航空爱好网 (https://www.52kongjun.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

基于PHP提取TXT文件向数据库导入海量数据的方法

发布时间:2022-07-10 03:20:15 所属栏目:PHP教程 来源:互联网
导读:有一个TXT文件,包含了10万条记录,格式如下: 列1 列2 列3 列4 列5 a 00003131 0 0 adductive#1 adducting#1 adducent#1 a 00003356 0 0 nascent#1 a 00003553 0 0 emerging#2 emergent#2 a 00003700 0.25 0 dissilient#1 后面有10万条 需求是要导入数据库
  有一个TXT文件,包含了10万条记录,格式如下:
 
  列1 列2 列3 列4 列5
 
  a 00003131 0 0 adductive#1 adducting#1 adducent#1
 
  a 00003356 0 0 nascent#1
 
  a 00003553 0 0 emerging#2 emergent#2
 
  a 00003700 0.25 0 dissilient#1
 
  ……………………后面有10万条………………
 
  需求是要导入数据库中,数据表的结构为
 
  word_id 自动增量
 
  word 【adductive#1 adducting#1 adducent#1】这一个TXT记录要转换为3个SQL记录
 
  value =第三列-第四列;如果=0,则此条记录略过不插入数据表
 
  复制代码 代码如下:www.CuoXIn.com
 
  <?php
 
  $file = 'words.txt';//10W条记录的TXT源文件
 
  $lines = file_get_contents($file);
 
  ini_set('memory_limit', '-1');//不要限制Mem大小,否则会报错
 
  $line=explode("/n",$lines);
 
  $i=0;
 
  $sql="INSERT INTO words_sentiment (word,senti_type,senti_value,word_type) VALUES ";
 
  foreach($line as $key =>$li)
 
  {
 
  $arr=explode(" ",$li);
 
  $senti_value=$arr[2]-$arr[3];
 
  if($senti_value!=0)
 
  {
 
  if($i>=20000&&$i<25000)//分批次导入,避免失败
 
  {
 
  $mm=explode(" ",$arr[4]);
 
  foreach($mm as $m) //【adductive#1 adducting#1 adducent#1】这一个TXT记录要转换为3个SQL记录 {
 
  $nn=explode("#",$m);
 
  $word=$nn[0];
 
  $sql.="(/"$word/",1,$senti_value,2),";//这个地方要注意到是 word有可能包含单引号(如jack's),因此我们要用双引号来包含word(注意转义)
 
  }
 
  }
 
  $i++;
 
  }
 
  }
 
  //echo $i;
 
  $sql=substr($sql,0,-1);//去掉最后一个逗号
 
  //echo $sql;
 
  file_put_contents('20000-25000.txt', $sql); //批量导入数据库,5000条一次,大概需要40秒的样子;一次导入太多max_execution_time会不够,导致失败
 
  ?>
 
  1,海量数据导入到时候,要注意PHP的一些限制,可以临时调整一下,否则会报错
 
  Allowed memory size of 33554432 bytes exhausted (tried to allocate 16 bytes)
 
  2,PHP操作TXT文件
 
  file_get_contents()
 
  file_put_contents()
 
  3,海量导入的时候,最好分批次导入,失败的几率小一些
 
  4,海量导入之前,脚本一定要多次测试无误再使用,比如用100条数据来测试
 
  5,导入之后,如果PHP的mem_limit还是不够的话,程序仍然跑不起来
 
  (建议用修改php.ini的方式来提高mem_limit,而不是用临时的语句)。
 

(编辑:航空爱好网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!