用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 文章调用类代码
Aug 11 PHP
使用迭代器 遍历文件信息的详解
Jun 08 PHP
PHP引用符&amp;的用法详细解析
Aug 22 PHP
PHP代码优化的53个细节
Mar 03 PHP
PHP中SESSION的注销与清除
Apr 16 PHP
PHP实现对二维数组某个键排序的方法
Sep 14 PHP
php 一维数组的循环遍历实现代码
Apr 10 PHP
php实现用户注册密码的crypt加密
Jun 08 PHP
yii2.0整合阿里云oss上传单个文件的示例
Sep 19 PHP
PHP切割整数工具类似微信红包金额分配的思路详解
Sep 18 PHP
Yii框架视图、视图布局、视图数据块操作示例
Oct 14 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+SqlServer实现分页显示
2006/10/09 PHP
PHP实现根据设备类型自动跳转相应页面的方法
2014/07/24 PHP
PHP中对数组的一些常用的增、删、插操作函数总结
2015/11/27 PHP
laravel migrate初学常见错误的解决方法
2017/10/11 PHP
php图片合成方法(多张图片合成一张)
2017/11/25 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
PHP实现会员账号单唯一登录的方法分析
2019/03/07 PHP
关于实现代码语法标亮 dp.SyntaxHighlighter
2007/02/02 Javascript
JQuery Tips(4) 一些关于提高JQuery性能的Tips
2009/12/19 Javascript
js 格式化时间日期函数小结
2010/03/20 Javascript
利用js判断浏览器类型(是否为IE,Firefox,Opera浏览器)
2013/11/22 Javascript
Javascript实现多彩雪花从天降散落效果的方法
2015/02/02 Javascript
C#中使用迭代器处理等待任务
2015/07/13 Javascript
使用CDN和AJAX加速WordPress中jQuery的加载
2015/12/05 Javascript
node.js实现爬虫教程
2020/08/25 Javascript
举例说明JavaScript中的实例对象与原型对象
2016/03/11 Javascript
页面get请求 中文参数方法乱码问题的快速解决方法
2016/05/31 Javascript
基于angularJS的表单验证指令介绍
2016/10/21 Javascript
vue.js实现格式化时间并每秒更新显示功能示例
2018/07/07 Javascript
layui数据表格实现重载数据表格功能(搜索功能)
2019/07/27 Javascript
微信小程序实现pdf、word等格式文件上传的方法
2019/09/10 Javascript
解决node.js含有%百分号时发送get请求时浏览器地址自动编码的问题
2019/11/20 Javascript
Vuex实现数据共享的方法
2019/12/20 Javascript
[00:32]2018DOTA2亚洲邀请赛Liquid出场
2018/04/03 DOTA
Python扫描IP段查看指定端口是否开放的方法
2015/06/09 Python
Python中__init__.py文件的作用详解
2016/09/18 Python
python删除服务器文件代码示例
2018/02/09 Python
python 按不同维度求和,最值,均值的实例
2018/06/28 Python
pandas DataFrame索引行列的实现
2019/06/04 Python
django的ORM操作 删除和编辑实现详解
2019/07/24 Python
解决Python数据可视化中文部分显示方块问题
2020/05/16 Python
matplotlib 生成的图像中无法显示中文字符的解决方法
2020/06/10 Python
中专生求职自荐信范文
2013/12/22 职场文书
员工晚婚的请假条
2014/02/08 职场文书
2015年教研组工作总结
2015/05/04 职场文书
2019年年中工作总结讲话稿模板
2019/03/25 职场文书