用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 相关文章推荐
一个可以找出源代码中所有中文的工具
Oct 25 PHP
浅析PHP中的UNICODE 编码与解码
Jun 29 PHP
ThinkPHP查询语句与关联查询用法实例
Nov 01 PHP
php单例模式实现方法分析
Mar 14 PHP
Apache启动报错No space left on device: AH00023该怎么解决
Oct 16 PHP
最新制作ThinkPHP3.2.3完全开发手册
Nov 23 PHP
symfony2.4的twig中date用法分析
Mar 18 PHP
Yii2实现ajax上传图片插件用法
Apr 28 PHP
浅谈php fopen下载远程文件的函数
Nov 18 PHP
原生php实现excel文件读写的方法分析
Apr 25 PHP
详解php协程知识点
Sep 21 PHP
PHP使用PDO操作sqlite数据库应用案例
Mar 07 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
利用 window_onload 实现select默认选择
2006/10/09 PHP
php生成缩略图的类代码
2008/10/02 PHP
php实现多站点共用session实现单点登录的方法详解
2019/09/18 PHP
为JavaScript提供睡眠功能(sleep) 自编译JS引擎
2010/08/16 Javascript
javascript标签在页面中的位置探讨
2013/04/11 Javascript
JavaScript不刷新实现浏览器的前进后退功能
2014/11/05 Javascript
jQuery实现拖动调整表格单元格大小的代码实例
2015/01/13 Javascript
jQuery实现tab标签自动切换的方法
2015/02/28 Javascript
每日十条JavaScript经验技巧(一)
2016/06/23 Javascript
javascript中BOM基础知识总结
2017/02/14 Javascript
基于JS实现仿百度百家主页的轮播图效果
2017/03/06 Javascript
vue双向绑定简要分析
2017/03/23 Javascript
bootstrap daterangepicker汉化以及扩展功能
2017/06/15 Javascript
收藏AngularJS中最重要的核心功能
2017/07/09 Javascript
Vue2.0如何发布项目实战
2017/07/27 Javascript
vue项目中使用百度地图的方法
2018/06/08 Javascript
js中Array对象的常用遍历方法详解
2019/01/17 Javascript
python使用matplotlib库生成随机漫步图
2018/08/27 Python
python url 参数修改方法
2018/12/26 Python
python 二维数组90度旋转的方法
2019/01/28 Python
Python中的几种矩阵乘法(小结)
2019/07/10 Python
python多任务之协程的使用详解
2019/08/26 Python
如何在sublime编辑器中安装python
2020/05/20 Python
聊聊python中的异常嵌套
2020/09/01 Python
解决margin 外边距合并问题
2019/07/03 HTML / CSS
FLIR美国官网:热成像, 夜视和红外摄像系统
2018/07/13 全球购物
什么是servlet链?
2014/07/13 面试题
技术总监岗位职责
2013/12/05 职场文书
法人代表委托书
2014/04/04 职场文书
小学教师师德整改措施
2014/09/29 职场文书
导游词之珠海轮廓
2019/10/25 职场文书
小学四年级作文之最感动的一件事
2019/11/01 职场文书
Python中threading库实现线程锁与释放锁
2021/05/17 Python
Python趣味挑战之用pygame实现简单的金币旋转效果
2021/05/31 Python
Maven学习----Maven安装与环境变量配置教程
2021/06/29 Java/Android
多台电脑共享文件怎么设置?多台电脑共享文件操作教程
2022/04/08 数码科技