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


Posted in PHP onApril 23, 2013

有一个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<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,而不是用临时的语句)

PHP 相关文章推荐
php程序效率优化的一些策略小结
Jul 17 PHP
php中AES加密解密的例子小结
Feb 18 PHP
Laravel框架中实现使用阿里云ACE缓存服务
Feb 10 PHP
php获取指定范围内最接近数的方法
Jun 02 PHP
PHP使用trim函数去除字符串左右空格及特殊字符实例
Jan 07 PHP
PHP给文字内容中的关键字进行套红处理
Apr 12 PHP
PHP中spl_autoload_register()函数用法实例详解
Jul 18 PHP
Yii2中关联查询简单用法示例
Aug 10 PHP
php微信开发之百度天气预报
Nov 18 PHP
thinkPHP框架中layer.js的封装与使用方法示例
Jan 18 PHP
PHP实现一个限制实例化次数的类示例
Sep 16 PHP
利用PHP计算有多少小于当前数字的数字方法示例
Aug 26 PHP
『PHP』PHP截断函数mb_substr()使用介绍
Apr 22 #PHP
基于magic_quotes_gpc与magic_quotes_runtime的区别与使用介绍
Apr 22 #PHP
怎样给PHP源代码加密?PHP二进制加密与解密的解决办法
Apr 22 #PHP
基于PHP Web开发MVC框架的Smarty使用说明
Apr 19 #PHP
PHP时间戳与日期之间转换的实例介绍
Apr 19 #PHP
php多文件上传功能实现原理及代码
Apr 18 #PHP
php实现多张图片上传加水印技巧
Apr 18 #PHP
You might like
令PHP初学者头疼十四条问题大总结
2008/11/12 PHP
PHP文件读写操作之文件读取方法详解
2011/01/13 PHP
解析在apache里面给php写虚拟目录的详细方法
2013/06/24 PHP
Yii 快速,安全,专业的PHP框架
2014/09/03 PHP
php一维二维数组键排序方法实例总结
2014/11/13 PHP
Extjs学习笔记之八 继承和事件基础
2010/01/08 Javascript
jQuery 动画弹出窗体支持多种展现方式
2010/04/29 Javascript
js 关键词高亮(根据ID/tag高亮关键字)案例介绍
2013/01/21 Javascript
jquery鼠标放上去显示悬浮层即弹出定位的div层
2014/04/25 Javascript
前端开发之CSS原理详解
2017/03/11 Javascript
解决vue router使用 history 模式刷新后404问题
2017/07/19 Javascript
解析vue、angular深度作用选择器
2019/09/11 Javascript
vue在路由中验证token是否存在的简单实现
2019/11/11 Javascript
[29:59]完美世界DOTA2联赛PWL S3 Forest vs access 第二场 12.11
2020/12/13 DOTA
Python中将字典转换为XML以及相关的命名空间解析
2015/10/15 Python
Python排序搜索基本算法之冒泡排序实例分析
2017/12/09 Python
python实现两个文件合并功能
2018/04/01 Python
Python中关键字global和nonlocal的区别详解
2018/09/03 Python
python实现多层感知器
2019/01/18 Python
对Python实现累加函数的方法详解
2019/01/23 Python
Python While循环语句实例演示及原理解析
2020/01/03 Python
Pytorch在dataloader类中设置shuffle的随机数种子方式
2020/01/14 Python
对pytorch的函数中的group参数的作用介绍
2020/02/18 Python
python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例
2020/03/06 Python
详解如何在css中引入自定义字体(font-face)
2018/05/17 HTML / CSS
捷克原创男装和女装购物网站:Bolf.cz
2018/04/28 全球购物
德国汽车零件和汽车配件网上商店:kfzteile24
2018/11/14 全球购物
俄罗斯韩国化妆品网上商店:Cosmasi.ru
2019/10/31 全球购物
科颜氏印度官网:Kiehl’s印度
2021/02/20 全球购物
写给老师的表扬信
2014/01/21 职场文书
应届生找工作求职信
2014/06/24 职场文书
2016年元旦主持词
2015/07/06 职场文书
2016年清明节寄语
2015/12/04 职场文书
演讲稿:​快乐,从不抱怨开始!
2019/04/02 职场文书
解决mysql:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO/YES)
2021/06/26 MySQL
Mysql分析设计表主键为何不用uuid
2022/03/31 MySQL