匹配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程序员工具
May 26 PHP
PHP 组件化编程技巧
Jun 06 PHP
php 短链接算法收集与分析
Dec 30 PHP
微信扫描二维码登录网站代码示例
Dec 30 PHP
thinkphp使用phpmailer发送邮件的方法
Nov 24 PHP
Yii分页用法实例详解
Dec 04 PHP
ThinkPHP中redirect用法分析
Dec 05 PHP
基于php的微信公众平台开发入门实例
Apr 15 PHP
ThinkPHP框架实现的邮箱激活功能示例
Jun 15 PHP
PHP PDO和消息队列的个人理解与应用实例分析
Nov 25 PHP
PHP实现文件上传操作和封装
Mar 04 PHP
php计数排序算法的实现代码(附四个实例代码)
Mar 31 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
谈谈PHP语法(3)
2006/10/09 PHP
PHP统计当前在线用户数实例讲解
2015/10/21 PHP
javascript 贪吃蛇实现代码
2008/11/22 Javascript
JSON 教程 json入门学习笔记
2020/09/22 Javascript
JSON序列化与解析原生JS方法且IE6和chrome测试通过
2013/09/05 Javascript
js读取注册表的键值示例
2013/09/25 Javascript
javascript实现网页端解压并查看zip文件
2015/12/15 Javascript
JavaScript tab选项卡插件实例代码
2016/02/23 Javascript
基于jQuery实现仿51job城市选择功能实例代码
2016/03/02 Javascript
JavaScript动态检验密码强度的实现方法
2016/11/09 Javascript
async/await与promise(nodejs中的异步操作问题)
2017/03/03 NodeJs
JavaScript数据结构之广义表的定义与表示方法详解
2017/04/12 Javascript
Vue.js搭建移动端购物车界面
2020/06/28 Javascript
JS限制输入框输入的实现代码
2018/07/02 Javascript
深入学习JavaScript中的bom
2019/05/27 Javascript
node省市区三级数据性能测评实例分析
2019/11/06 Javascript
[01:37]DOTA2超级联赛专访ChuaN 传奇般的电竞之路
2013/06/19 DOTA
[05:26]TI10典藏宝瓶套装外观展示
2020/07/03 DOTA
python实现文件名批量替换和内容替换
2014/03/20 Python
pyttsx3实现中文文字转语音的方法
2018/12/24 Python
与Django结合利用模型对上传图片预测的实例详解
2019/08/07 Python
Python OpenCV实现鼠标画框效果
2020/08/19 Python
Django框架 Pagination分页实现代码实例
2019/09/04 Python
利用4行Python代码监测每一行程序的运行时间和空间消耗
2020/04/22 Python
Python日志处理模块logging用法解析
2020/05/19 Python
Python如何自动获取目标网站最新通知
2020/06/18 Python
Python 中如何写注释
2020/08/28 Python
PyTorch中的拷贝与就地操作详解
2020/12/09 Python
《列夫托尔斯泰》教学反思
2014/02/10 职场文书
2014年商场国庆节活动策划方案
2014/09/16 职场文书
一年级班主任工作总结2014
2014/11/08 职场文书
2014年医院科室工作总结
2014/12/20 职场文书
2019年最新七夕唯美祝福语(60条)
2019/07/22 职场文书
《曾国藩家书》读后感——读家书,立家风
2019/08/21 职场文书
标准版个人借条怎么写?以及什么是借条?
2019/08/28 职场文书
导游词之江苏溱潼古镇
2019/11/27 职场文书