PHP读取超大文件的实例代码
去年年底的各种网站帐号信息的数据库泄漏,很是给力啊,趁机也下载了几个数据库,准备学学数据分析家来分析一下这些帐号信息。虽然这些数据信息都已经被“整理”过的,不过自己拿来学习也挺有用的,毕竟有这么大的数据量。
数
据量大带来的问题就是单个文件很大,能够打开这个文件相当不容易,记事本就不要指望了,果断死机。用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读取excel文件的实例代码
php读取excel文件的实例代码. 代码: <?php /** * php读取excel文件 * by www.jbxue.com */ $this->loadexcel();//半酣p ...
- java中利用RandomAccessFile读取超大文件
超大文件我们使用普通的文件读取方式都很慢很卡,在java中为我提供了RandomAccessFile函数,可以快速的读取超大文件并且不会感觉到卡哦,下面看我的一个演示实例. 服务器的日志文件往往达到4 ...
- JavaScript 解析读取XML文档 实例代码(转)
JavaScript解析读取XML文件,主要就是加载并解析XML文件,然后就可以测试解析的XML文件的内容,打印输出来. 在线演示:http://demo.jb51.net/js/2012/readx ...
- PHP执行.SQL文件的实例代码分享
介绍下使用PHP执行.SQL文件的代码一例,分享下. demo.php: <?php ) )) ) ENGINE) unsigned ) unsigned )) ) ENGINE) unsign ...
- PHPExcel读取Excel文件的实现代码
<?php require_once 'PHPExcel.php'; /**对excel里的日期进行格式转化*/ function GetData($val){ $jd = GregorianT ...
- 读取DBF文件的部分代码
private void BtnOpenInitial_Click(object sender, EventArgs e) { OpenFileDialog file = new OpenFileDi ...
- (实用篇)PHPExcel读取Excel文件的实现代码
用PHPExcel读取Excel 2007 或者Excel2003文件,需要的朋友,可以参考下. 涉及知识点: php对excel文件进行循环读取 php对字符进行ascii编码转化,将字符转为十进 ...
- php导出超大csv导出方法,读取超大文件或者接受超大数组,防止内存溢出
基本思路就是,知道总数之后分割成2万一个数组进行查询,最后独立写入csv,避免数据过大导致溢出 速度还不错,在php7下,机器I5 8G内存,128G,SSD,52W多条,大概也就30秒,出来整个文件 ...
- php读取超大文件fseek
function readMaxFile($fp , $start = 0) { $tag = "\n"; $i = 0; $content = ''; while($i < ...
随机推荐
- linux非常用但很有用的命令
查找指定目录下包含指定字符串的所有文件 grep -rl 'abc' / top查看命令的完整启动路径 top 按c top以MB为单位显示内存信息 top -M 查看内存top io趋势 pidst ...
- PHP发短信 PEAR 包:Services_Sms
PHP发短信 PEAR 包:Services_Sms 对于这种第三方库,PHP官方称之为PEAR,需要按照PEAR标准开发(标准URI). PEAR的优势:一键安装到php/lib/php目录,req ...
- 命令行工具解析Crash文件,dSYM文件进行符号化
备份 文/爱掏蜂窝的熊(简书作者)原文链接:http://www.jianshu.com/p/0b6f5148dab8著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 序 在日常开发 ...
- Permit.js – 用于构建多状态原型的 jQuery 插件
Permit.js 是一个 jQuery 插件,用于构建交互的,多态的网站原型和应用程序原型.也许你的网站有的功能仅适用于登录的成员,只有管理员才能使用或者你的应用程序会根据线上或离线有不同的功能,这 ...
- 充满想象力的 JavaScript 物理和重力实验
在这个列表中挑选了9个物理和重力实验,用来展示 Javascript 的强大.几年前,所有这些实验都必须使用 Java 或 Flash 才能做.在下面这些惊人的例子中,就个人而言,我比较喜欢仿真布料的 ...
- 【HTML】字符(Glyphs)收集
Special Characters " " " quotation mark u+0022 ISOnum p:before { content:"\0022& ...
- HTML动画分类 HTML5动画 SVG库 SVG工具 Canvas动画工具
1.js配合传统css属性控制,可以使用setTimeout或者高级的requestAnimationFrame 2.css3 3.svg 4.canvas(当然,这个还是要配合js) 也许这么 ...
- 浅谈float浮动
float大概是css3以前网页布局里最常用的一个属性了,经常看到一言不合就浮动的代码,就一起来深入挖掘一下这个一半天使一半魔鬼的属性吧. 本文是读张鑫旭大神慕课网float视频后的一些总结及一些拓展 ...
- form中动态生成Radiobutton控件
public partial class GetLabelFields : Form { int tableCount; public GetLabelFields(AxMapControl axma ...
- Android九宫格界面实现点击每个格点击跳转界面
刚开始有个任务就是做一个九宫格界面,后来有个任务就是实现点击每个格并跳转界面实现每个格的功能.下面我就介绍一下我是如何实现该功能的 首先写一下我的想法是: 登录成功后显示一个九宫格界面,每个九宫格的每 ...