Heim  >  Artikel  >  Backend-Entwicklung  >  PHP处理TXT文件向数据库导入海量数据_PHP教程

PHP处理TXT文件向数据库导入海量数据_PHP教程

WBOY
WBOYOriginal
2016-07-14 10:10:08785Durchsuche

有一个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,则此条记录略过不插入数据表

 

 

[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             { 
                $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会不够,导致失败       
?> 

    $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             {
             $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,而不是用临时的语句)

 

 

 

 

 

 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/477529.htmlTechArticle有一个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 em...
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn