CSDN-中文IT社区-600万 数据泄露,我想这600多万中大部分是程序员吧。
而我们首先关心是的,这部分数据中是否有没有自己的。大部分编辑器打开会很卡,建议使用的软件
1. Editplus
2. WINHEX
3. UltraEdit
这些软件基本都是一次把数据读入内存了(小内存机要注意喽,用了虚拟内存速度也会稍慢了一点)
或许有人窃喜没有自己的,有人担忧自己的密码泄露(很多人账号密码在不同的地方都一样),或许还有人图谋不轨(不过我相信程序员都是高素质的)
其实这个数据也是很有实验价值的。
1. 统计价值
a) 参考 http://www.cnbeta.com/articles/166576.htm
2. 实验价值
a) 对于一般程序员来说,这份数据还是很庞大的。可以做很多实验
由于鄙人属于特别好奇的那种,毫不犹豫做了两个实验。。。
实验一:将600万行导入mysql(PHP)
实验环境
1.win7+mysql+php+apache
2.mysql:utf-8编码,InnoDB
程序流程:php每一行的读取文件,通过正则表达式,提取用户名,密码,邮箱
- <?php
- /**
- *作者:小桥流水
- *时间:2011-12-23
- */
- $count_pattern = 0; /*匹配成功个数*/
- $count_query = 0; /*数据库插入成功个数*/
- $filename = "www.csdn.net.sql"; /*打开的文件名*/
- $pattern = "/(.+)\s#\s(.+)\s#\s(.+)/"; /*正则匹配模式串*/
- $link = mysql_connect("localhost", "root", "password");
- if(!$link){
- echo "sql connect error!";
- exit;
- }
- mysql_select_db("csdn",$link);
- mysql_query("set names gbk",$link);
- echo "文件".$filename."大小为:".filesize($filename)." 字节<br>";
- date_default_timezone_set("PRC");
- echo "开始时间:".date("Y-m-d H:i:s")."<br>";
- if($TheFile = fopen($filename, "r")){
- $i = 0;
- while(!feof($TheFile))
- {
- $line = fgetss($TheFile,255);
- if(preg_match($pattern, $line, $arr)){
- $count_pattern++;
- $sql = "INSERT INTO user (username, psw, email) VALUES ('$arr[1]', '$arr[2]', '$arr[3]')";
- if(mysql_query($sql, $link)){
- $count_query++;
- }else{
- echo "<font color ='blue'>失败的sql语句:".$sql."</font><br>";
- }
- }
- $i++;
- if($i%1000 == 0){
- echo "执行到第".$i."条...<br>";
- if($i == 10000)/*只用前10000行做测试*/
- break;
- }
- }
- if(!fclose($TheFile)){
- echo "关闭文件句柄失败!";
- }
- }
- echo "结束时间:".date("Y-m-d H:i:s")."<br>";
- mysql_close($link);
- echo "<font color='red'><br>-----------结果-----------<br>";
- echo "正则表达式匹配成功:".$count_pattern."条!<br>";
- echo "数据库插入成功:".$count_query."条!</font><br>";
- ?>
测试结果:
1.10000行的结果
有两条sql语句错误,主要原因是没有转义特殊字符,多次实验平均时间为12秒
由此判断这样插入数据,600万条数据需要10分种以上!
2.准备将600万条全部导入
首先,将php的脚本最大执行时间改一下,我改成1200(20分钟)。打开php.ini搜索max_execution_time
重启apache,然后以下PHP代码
- if($i == 10000)/*只用前10000行做测试*/
- break;
注释掉, 浏览器执行请求,开始漫长的等待。。。等待中,查看这些数据a)php访问该文件速度
大约:72.8KB/s (很慢哈)
b)mysql写入速度
经过我的眼测:平均速度保持在5MB/S的写入,如果一直写20分钟的话,6G的空间就没了
3.实验结果
这样的结果却是令人很失望,按照10000条计算 ,20分钟超过600倍的时间,还是没有插入完,甚至只插入了100万多条。(我想,IO速度越到后面,速度愈慢吧,就像复制文件一样,刚开始很快,过一会就慢下来了)
总结:每次只读取一行,IO速度很慢,浪费很多时间,同时mysql写入速度也是有限的
实验二:用php实现数据的搜索
实验环境一样
程序流程:每次也只读取一行
实验较简单,直接贴我的代码了
- <!--作者:小桥流水-->
- <html>
- <head>
- <title>CSDN泄露数据查询</title>
- </head>
- <body>
- <h2>CSDN泄露数据查询</h2>
- <hr>
- <form method="get" action="test.php">
- 关键字:<input type="text" name="kw" size="30"><br>
- <input type="reset" value="重置">
- <input type="submit" value="查询">
- </form>
- <hr>
- </p>
- <?
- if($_GET["kw"]!='' && $_GET["kw"]!=NULL){
- $sw = $_GET["kw"];
- }else{
- exit;
- }
- echo "查询<b>".$sw."</b><br>";
- $filename = "www.csdn.net.sql";
- date_default_timezone_set("PRC");
- echo "开始时间:".date("Y-m-d H:i:s")."<br>";
- if($TheFile = fopen($filename, "r")){
- $i = 0;
- $j = 0;
- while(!feof($TheFile))
- {
- $line = fgetss($TheFile,255);
- if(strpos($line,$sw) != NULL){
- $line = preg_replace("/($sw)/i","<font color='red'><b>\\1</b></font>", $line);
- echo "第".$i."行:".$line."<br>";
- $j++;
- }
- $i++;
- }
- if(!fclose($TheFile)){
- echo "关闭文件句柄失败!";
- }
- if($j>0){
- echo "<font color='#22FF22'>共有".$j."条记录!</font><br>";
- }else{
- echo "<font color='red'><没有查到:".$sw."</font><br>";
- }
- }
- echo "结束时间:".date("Y-m-d H:i:s")."<br>";
- ?>
- </body>
- </html>
平均时间大概:15秒
结论:IO和函数成为查询速度的瓶颈!