匹配csdn用户数据库与官方用户的重合度并将重叠部分的用户筛选出来


Posted in PHP onDecember 25, 2011

过程:
1、获取csdn的用户数据库导入本地
试用editplus打开提示内存不足,没找到办法,同事的linux下查看了一下,基本的格式如下:
用户名 # 密码 # 邮箱
用户名 # 密码 # 邮箱
相应数据结构:

CREATE TABLE IF NOT EXISTS `csdn_userdb` ( 
`id` int(10) NOT NULL auto_increment, 

`username` varchar(50) character set gbk NOT NULL, 

 `password` varchar(50) character set gbk NOT NULL, 

`email` varchar(50) character set gbk NOT NULL, 

 PRIMARY KEY (`id`), 

KEY `username` (`username`), 

KEY `email` (`email`) 

) ENGINE=MyISAM DEFAULT CHARSET=gbk AUTO_INCREMENT=1 ;

一直怀疑fopen打开文件是写入缓存的,但是实践证明速度很快,应该是没有写入缓存,以下为导入数据的代码
<?php 
$link = mysql_connect('localhost', 'root', 'admin', true); 
mysql_select_db('csdn',$link); 
$handle = fopen("C:\Users\zhudong\Desktop\www.csdn.net.sql", "r"); 
while (!feof($handle)){ 
$i++; 
$buffer = fgets($handle); 
list($u,$p,$e) = explode(" # ",$buffer); 
mysql_query("INSERT INTO csdn_userdb(username,password,email) VALUES ('$u','$p','$e')",$link); 
if ($i%1000 == 0) echo $i."\n"; 
} 
fclose($handle); 
?>

以上代码效率非常差,故做修改后代码如下:
<?php 
$link = mysql_connect('localhost', 'root', 'admin', true); 
mysql_select_db('csdn',$link); 
$handle = fopen("C:\Users\zhudong\Desktop\www.csdn.net.sql", "r"); 
$perpage = 50; 
while (!feof($handle)){ 
$i++; 
$buffer = fgets($handle); 
list($u,$p,$e) = explode(" # ",$buffer); 
$insertValue[] = "('$u','$p','$e')"; 
if ($i% $perpage == 0){ $perpage == 0){ 
$instrtValueString = implode(',',$insertValue); 
mysql_query("INSERT INTO csdn_userdb(username,password,email) VALUES $instrtValueString",$link); 
echo $i."\n"; 
$insertValue = array(); 
} 
} 
fclose($handle);

为了搞清楚有那些因素对导入数据的效率产生影响,故根据不同的设置进行了测试
CSDN用户总数据 6428600
当$perpage=500;导入后数据:5,902,000;数据丢失526600 丢失率:8%;数据表引擎:MyISAM;索引:有;总耗时 :15分钟
当$perpage=200,导入后数据总数:6,210,200;数据丢失:218400;丢失率:3.3%;数据表引擎: MYISAM ;索引:有;总耗时:30分钟
当$perpage=200,导入后数据总数:6,210,200;数据丢失:218400;丢失率:3.3%;数据表引擎:INNODB;索引:有;总耗时:65分钟
当$perpage=200,导入后数据总数:6,210,200;数据丢失:218400;丢失率:3.3%;数据表引擎:MYISAM;索引:无;总耗时:14分钟(数据导入完毕后单独再建索引)
当$perpage=50,导入后数据总数:6,371,200;数据丢失:57400,丢失率:0.8%;数据表引擎:MYISAM;索引:无:总耗时:20分钟
根据以上情况总结如下:
1、先导入数据后加索引的效率要比先加索引后导入数据的高一倍
2、InnoDB 在单进程数据插入上的效率要比MYISAM低很多
3、当perpage=50的情况下数据丢失率在1%以下
因为通过浏览器执行会有超时的问题,而且效率地下,故通过命令行方式运行,此过程中遇到一点小麻烦耽搁了不少时间 
起初我执行如下代码: 
php.exe E:\usr\www\importcsdndb.php 
但是一直报错:call to undefined function mysql_connect 
折腾发现没有载入php.ini 
正确代码为: 
php.exe -c E:/usr/local/apache2/php.ini importcsdndb.php

2、导入需要匹配的用户数据数据至本地
命令行进入msyql(不会的自己百度)
然后执行:mysql>source C:/Users/zhudong/Desktop/userdb.sql
3、对比筛选用户
对比程序写好了,切记在命令行下运行:
<?php 
$link = mysql_connect('localhost', 'root', 'admin', true); 
mysql_select_db('csdn',$link); 
$handle_username = fopen("E:/records_username.txt","a"); 
//$handle_email = fopen("E:/records_email.txt","a"); 
$username_num = $email_num = $uid = 0; 
while ($uid<2181106) { 
$nextuid=$uid+10000; 
$query = mysql_query("SELECT * FROM pw_members WHERE uid>'$uid' AND uid<'$nextuid'"); 
while ($rt = mysql_fetch_array($query,MYSQL_ASSOC)) { 
$username = $rt['username']; 
$email = $rt['email']; 
$query2 = mysql_query("SELECT * FROM scdn_userdb WHERE username='$username' OR email='$email'"); 
while ($rt2 = mysql_fetch_array($query2,MYSQL_ASSOC)) { 
if ($rt['password'] = md5($rt2['password'])) { 
if ($rt2['username'] == $username) { 
$username_num++; 
fwrite($handle_username,'OWN:'.$rt['uid'].'|'.$rt['username'].'|'.$rt['password'].'|'.$rt['email'].' CSDN:'.$rt2['username'].'|'.$rt2['password'].'|'.$rt2['email']."\r\n"); 
echo 'username_num='.$username_num."\r\n"; 
continue; 
} 
/* 
if ($rt2['email'] == $email) { 
$email_num++; 
fwrite($handle_email,'OWN:'.$rt['uid'].'|'.$rt['username'].'|'.$rt['password'].'|'.$rt['email'].' CSDN:'.$rt2['username'].'|'.$rt2['password'].'|'.$rt2['email']."\r\n"); 
echo 'email_num='.$email_num."\r\n"; 
} 
*/ 
} 
} 
mysql_free_result($query2); 
} 
$uid = $nextuid; 
} 
?>

您看到的以上的代码是非常蹩脚的,因为其效率特别低 ,几百万的数据,要跑10多个小时,怎么能忘记连表查询这么基本的东西呢,以下为修正后的方法
$link = mysql_connect('localhost', 'root', 'admin', true); 
mysql_select_db('csdn',$link); 
$handle_username = fopen("E:/records_username.txt","a"); 
while($uid<2181106) {//此处的数字为要对比用户库的最大ID 
$nextuid= $uid+10000; 
$query = mysql_query("SELECT m.uid,m.username,m.password,m.email,u.password as csdn_password,u.email as csdn_email FROM own_members m LEFT JOIN csdn_userdb u USING(username) WHERE m.uid>'$uid' AND m.uid<='$nextuid' AND u.username!=''"); 
while ($rt = mysql_fetch_array($query,MYSQL_ASSOC)) { 
if ($rt['password'] == md5($rt['csdn_password'])) { 
$username_num++; 
fwrite($handle_username,'OWN:'.$rt['uid'].'|'.$rt['username'].'|'.$rt['password'].'|'.$rt['email'].' CSDN:'.$rt['username'].'|'.$rt['csdn_password'].'|'.$rt['csdn_email']."\r\n"); 
echo 'username_num='.$username_num."\r\n"; 
} 
} 
$uid = $nextuid; 
echo 'uid='.$uid; 
} 
?>

总对比时间25分钟,相比较之前10多个小时的执行真是大有提升
总重名用户:34175
占总会员比例:1.7%
1.7%的重名用户还是挺严重的,希望本文对各位站长对比出本站的用户有所帮助
PHP 相关文章推荐
透析PHP的配置文件php.ini
Oct 09 PHP
php初学者写及时补给skype用户充话费的小程序
Nov 02 PHP
PHP学习笔记 (1) 环境配置与代码调试
Jun 19 PHP
PHP 图片上传代码
Sep 13 PHP
Zend的Registry机制的使用说明
May 02 PHP
php中array_multisort对多维数组排序的方法
Jun 21 PHP
利用PHP将部分内容用星号替换
Apr 21 PHP
PHP常用文件操作函数和简单实例分析
Jun 03 PHP
PHP正则表达式匹配替换与分割功能实例浅析
Feb 04 PHP
PHP实现从上往下打印二叉树的方法
Jan 18 PHP
PHP标准库(PHP SPL)详解
Mar 16 PHP
php使用filter_var函数判断邮箱,url,ip格式示例
Jul 06 PHP
php操作JSON格式数据的实现代码
Dec 24 #PHP
php文件怎么打开 如何执行php文件
Dec 21 #PHP
使用JSON实现数据的跨域传输的php代码
Dec 20 #PHP
php自动注册登录验证机制实现代码
Dec 20 #PHP
php4与php5的区别小结(配置异同)
Dec 20 #PHP
利用ThinkPHP内置的ThinkAjax实现异步传输技术的实现方法
Dec 19 #PHP
如何使用Linux的Crontab定时执行PHP脚本的方法
Dec 19 #PHP
You might like
初学者入门:细述PHP4的核心Zend
2006/09/05 PHP
php桌面中心(四) 数据显示
2007/03/11 PHP
DEDE采集大师官方留后门的删除办法
2011/01/08 PHP
php中的curl_multi系列函数使用例子
2014/07/29 PHP
PHP封装分页函数实现文本分页和数字分页
2014/10/23 PHP
Yii框架用户登录session丢失问题解决方法
2017/01/07 PHP
JScript内置对象Array中元素的删除方法
2007/03/08 Javascript
W3C Group的JavaScript1.8 新特性介绍
2009/05/19 Javascript
JQuery 表单中textarea字数限制实现代码
2009/12/07 Javascript
JavaScript事件处理器中的event参数使用介绍
2013/05/24 Javascript
Extjs4中的分页应用结合前后台
2013/12/13 Javascript
用js一次改变多个input的readonly属性值的方法
2014/06/11 Javascript
Javascript模块化编程详解
2014/12/01 Javascript
javascript简单实现图片预加载
2014/12/03 Javascript
再谈JavaScript线程
2015/07/10 Javascript
原生js实现网易轮播图效果
2020/04/10 Javascript
纯js实现倒计时功能
2017/01/06 Javascript
echarts饼图扇区添加点击事件的实例
2017/10/16 Javascript
详解keep-alive + vuex 让缓存的页面灵活起来
2019/04/19 Javascript
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
2020/01/16 Javascript
从零开始在vue-cli4配置自适应vw布局的实现
2020/06/08 Javascript
js实现鼠标拖曳效果
2020/12/30 Javascript
使用实现pandas读取csv文件指定的前几行
2018/04/20 Python
Python中分支语句与循环语句实例详解
2018/09/13 Python
Python中numpy模块常见用法demo实例小结
2019/03/16 Python
python将excel转换为csv的代码方法总结
2019/07/03 Python
Python3 字典dictionary入门基础附实例
2020/02/10 Python
解决Python pip 自动更新升级失败的问题
2020/02/21 Python
CSS3实现菜单悬停效果
2020/11/17 HTML / CSS
台湾网购生鲜第一品牌:i3Fresh爱上新鲜
2017/10/26 全球购物
新加坡最佳婴儿用品店:Mamahood.com.sg
2018/08/26 全球购物
一套Delphi的笔试题一
2016/02/14 面试题
硅酸盐工业控制专业应届生求职信
2013/11/02 职场文书
班长自荐书范文
2014/02/11 职场文书
婚宴父亲致辞
2015/07/27 职场文书
MySQL 服务和数据库管理
2021/11/11 MySQL