用PHP读取超大文件的实例代码


Posted in PHP onApril 01, 2012

去年年底的各种网站帐号信息的数据库泄漏,很是给力啊,趁机也下载了几个数据库,准备学学数据分析家来分析一下这些帐号信息。虽然这些数据信息都已经被“整理”过的,不过自己拿来学习也挺有用的,毕竟有这么大的数据量。

数据量大带来的问题就是单个文件很大,能够打开这个文件相当不容易,记事本就不要指望了,果断死机。用MSSQL的客户端也打不开这么大的SQL文件,直接报内存不足,原因据说是MSSQL在读取数据的时候,是一次性地将读取到的数据放在内存中,如果数据量过大,而内存不足,则会直接导致系统瘫掉。

Navicat Premium
这儿推荐一个软件Navicat Premium,相当给力啊,几百兆的SQL文件轻松就打开了,一点都不卡。而且这个客户端软件支持MSSQL、MYSQL、Oracle……等等各种数据库的连接,其它的很多功能就自己慢慢研究了。

虽然用Navicat可以打开CSDN这个274MB的SQL文件,但是内容却是没意义的,而且也不方便对这些帐号信息进行查询、分类、统计等等操作。唯一的方法就是把这些数据一条一条地读取出来,然后分拆每条记录的不同片段,再将这些片段以数据字段的格式存入数据库,这样就可以方便以后的使用了。

使用PHP读取超大文件
PHP有很多种文件读取的方式,根据目标文件的不同,采取更合适的方法,可有效地提高执行效率。由于CSDN数据库文件很大,所以我们尽量不在短时间内全都读取出来,毕竟每读取一条数据还要对其分拆和写入操作。那么比较合适的方式就是对文件进行分区域地读取,通过使用PHP的fseek和fread相结合,即可做到随意读取文件中的某一部份数据,下面是实例代码:

function readBigFile($filename, $count = 20, $tag = "\r\n") { 
$content = "";//最终内容 
$current = "";//当前读取内容寄存 
$step= 1;//每次走多少字符 
$tagLen = strlen($tag); 
$start = 0;//起始位置 
$i = 0;//计数器 
$handle = fopen($filename,'r+');//读写模式打开文件,指针指向文件起始位置 
while($i < $count && !feof($handle)) { 
fseek($handle, $start, SEEK_SET);//指针设置在文件开头 
$current = fread($handle,$step);//读取文件 
$content .= $current;//组合字符串 
$start += $step;//依据步长向前移动 
//依据分隔符的长度截取字符串最后免得几个字符 
$substrTag = substr($content, -$tagLen); 
if ($substrTag == $tag) { //判断是否为判断是否是换行或其他分隔符 
$i++; 
$content .= "<br />"; 
} 
} 
//关闭文件 
fclose($handle); 
//返回结果 
return $content; 
} 
$filename = "csdn.sql";//需要读取的文件 
$tag = "\n";//行分隔符 注意这里必须用双引号 
$count = 100;//读取行数 
$data = readBigFile($filename,$count,$tag); 
echo $data;

关于函数传入的变量$tag的值,根据系统不一样,传入的值也是有区别的:Windows用”\r\n”,linux/unix用”\n”,Mac OS用”\r”。

程序执行的大概流程:先定义读取文件的一些基础变量,然后打开文件,将指针定位在文件的指定位置,并读取指定大小的内容。每读取一次将内容存储在变量中,直到达到读取要求的行数或文件结束。

绝不要假定程序中的一切都将按计划运行。

根据上面的代码,虽然能够得到文件中指定位置、指定大小的数据,但这整个过程只执行了一次,并不能得到所有的数据。其实要得到所有的数据,可以在这个循环的外层再添加判断文件是否结束的循环,但这很浪费系统资源,甚至由于文件过大一直没法读完而导致PHP执行超时。另一种方法就是记录并存储上次读取数据后指针所在的位置,然后再次执行该循环的时候,将指针定位在上次结束的位置,这样就不存在一次循环要把文件从头读到尾的情况。

其实CSDN这个数据库我到现在都还没有导入数据库,因为当时泄漏后没几天CNBETA上就有一个分析了,呵呵,动作太快了。当看到别人已经做了这个事之后,自动就没有多少动力来做了,不过为了学习,还是要抽时间把这个事完成了。

PHP 相关文章推荐
一个php作的文本留言本的例子(五)
Oct 09 PHP
php max_execution_time执行时间问题
Jul 17 PHP
ThinkPHP写第一个模块应用
Feb 20 PHP
PHP批量采集下载美女图片的实现代码
Jun 03 PHP
PHP设计模式之迭代器模式的深入解析
Jun 13 PHP
php 如何获取数组第一个值
Aug 06 PHP
php curl模拟post请求小实例
Nov 13 PHP
php下foreach提示Warning:Invalid argument supplied for foreach()的解决方法
Nov 11 PHP
PHP实现的猴王算法(猴子选大王)示例
Apr 30 PHP
php workerman定时任务的实现代码
Dec 23 PHP
PHP利用pdo_odbc实现连接数据库示例【基于ThinkPHP5.1搭建的项目】
May 13 PHP
详解Go与PHP的语法对比
May 29 PHP
PHP新手用的Insert和Update语句构造类
Mar 31 #PHP
PHP中SESSION使用中的一点经验总结
Mar 30 #PHP
PHP __autoload()方法真的影响性能吗?
Mar 30 #PHP
phpmyadmin3 安装配置图解教程
Mar 29 #PHP
php 注释规范
Mar 29 #PHP
php 计划任务 检测用户连接状态
Mar 29 #PHP
MySQL的FIND_IN_SET函数使用方法分享
Mar 27 #PHP
You might like
php include的妙用,实现路径加密
2008/07/29 PHP
从零开始学YII2框架(二)通过 Composer 安装扩展插件
2014/08/20 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
js实现DIV的一些简单控制
2007/06/04 Javascript
jQuery 操作XML入门
2008/12/25 Javascript
客户端限制只能上传jpg格式图片的js代码
2010/12/09 Javascript
文本框(input)获取焦点(onfocus)时样式改变的示例代码
2014/01/10 Javascript
JQuery动画animate的stop方法使用详解
2014/05/09 Javascript
node.js应用后台守护进程管理器Forever安装和使用实例
2014/06/01 Javascript
JQuery对表单元素的基本操作使用总结
2014/07/18 Javascript
基于jQuery Circlr插件实现产品图片360度旋转
2015/09/20 Javascript
基于JavaScript实现瀑布流效果(循环渐近)
2016/01/27 Javascript
全面解析JavaScript中的valueOf与toString方法(推荐)
2016/06/14 Javascript
jquery 获取select数组与name数组长度的实现代码
2016/06/20 Javascript
JS仿hao123导航页面图片轮播效果
2016/09/01 Javascript
Vue2.2.0+新特性整理及注意事项
2018/08/22 Javascript
js使用cookie实现记住用户名功能示例
2019/06/13 Javascript
vue远程加载sfc组件思路详解
2019/12/25 Javascript
Vue将props值实时传递 并可修改的操作
2020/08/09 Javascript
JavaScript 中的六种循环方法
2021/01/06 Javascript
[09:37]DOTA2卡尔工作室 英雄介绍圣堂刺客篇
2013/06/13 DOTA
[01:13:08]2018DOTA2亚洲邀请赛4.6 淘汰赛 mineski vs LGD 第二场
2018/04/10 DOTA
Python计算回文数的方法
2015/03/11 Python
Python PyQt5标准对话框用法示例
2017/08/23 Python
对Pandas DataFrame缺失值的查找与填充示例讲解
2018/11/06 Python
Python3.6中Twisted模块安装的问题与解决
2019/04/15 Python
Python列表元素常见操作简单示例
2019/10/25 Python
基于tf.shape(tensor)和tensor.shape()的区别说明
2020/06/30 Python
css3过渡_动力节点Java学院整理
2017/07/11 HTML / CSS
美国汽车交易网站:Edmunds
2016/08/17 全球购物
白宫黑市官网:White House Black Market
2016/11/17 全球购物
Omio法国:全欧洲低价大巴、火车和航班搜索和比价
2017/11/13 全球购物
枚举和一组预处理的#define有什么不同
2016/09/21 面试题
八月一日观后感
2015/06/10 职场文书
详细分析PHP7与PHP5区别
2021/06/26 PHP
python数字图像处理数据类型及颜色空间转换
2022/06/28 Python