匹配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针对数字的加密解密类
Mar 20 PHP
一个严格的PHP Session会话超时时间设置方法
Jun 10 PHP
php基于base64解码图片与加密图片还原实例
Nov 03 PHP
PHP记录和读取JSON格式日志文件
Jul 07 PHP
php实现文章置顶功能的方法
Oct 20 PHP
yii2使用GridView实现数据全选及批量删除按钮示例
Mar 01 PHP
php file_get_contents取文件中数组元素的方法
Apr 01 PHP
php实现生成code128条形码的方法详解
Jul 19 PHP
Yii支持多域名cors原理的实现
Dec 05 PHP
PHP实现支持CURL字符串证书传输的方法
Mar 23 PHP
laravel框架实现后台登录、退出功能示例
Oct 31 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
Feb 27 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小技巧之过滤ascii控制字符
2014/05/14 PHP
CodeIgniter钩子用法实例详解
2016/01/20 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
2017/05/05 PHP
PHP判断密码强度的方法详解
2017/05/26 PHP
Laravel模型间关系设置分表的方法示例
2018/04/21 PHP
php实现的顺序线性表示例
2019/05/04 PHP
asp 取文本框名称代码
2008/12/02 Javascript
jQuery 获取对象 基本选择与层级
2010/05/31 Javascript
js定时器怎么写?就是在特定时间执行某段程序
2013/10/11 Javascript
jQuery对下拉框,单选框,多选框的操作
2014/02/21 Javascript
JS定时器实现数值从0到10来回变化
2016/12/09 Javascript
详解jQuery选择器
2016/12/21 Javascript
bootstrap栅格系统示例代码分享
2017/05/22 Javascript
jQuery实现带右侧索引功能的通讯录示例【附源码下载】
2018/04/17 jQuery
对vue中v-on绑定自定事件的实例讲解
2018/09/06 Javascript
微信小程序 弹窗输入组件的实现解析
2019/08/12 Javascript
优雅的使用javascript递归画一棵结构树示例代码
2019/09/22 Javascript
js单线程的本质 Event Loop解析
2019/10/29 Javascript
nodemon实现Typescript项目热更新的示例代码
2019/11/19 Javascript
vue quill editor 使用富文本添加上传音频功能
2020/01/14 Javascript
vue移动端使用canvas签名的实现
2020/01/15 Javascript
design vue 表格开启列排序的操作
2020/10/28 Javascript
vue中封装axios并实现api接口的统一管理
2020/12/25 Vue.js
python输出当前目录下index.html文件路径的方法
2015/04/28 Python
对numpy.append()里的axis的用法详解
2018/06/28 Python
python requests 库请求带有文件参数的接口实例
2019/01/03 Python
python range实例用法分享
2020/02/06 Python
python网络编程socket实现服务端、客户端操作详解
2020/03/24 Python
Python3.9.0 a1安装pygame出错解决全过程(小结)
2021/02/02 Python
CSS3制作苹果风格键盘特效
2015/02/26 HTML / CSS
Lookfantastic葡萄牙官方网站:欧洲第一大化妆品零售商
2018/03/17 全球购物
一套带答案的C++笔试题
2014/01/10 面试题
小学数学教学反思
2014/02/02 职场文书
给学校的建议书范文
2014/05/15 职场文书
社区敬老月活动总结
2015/05/07 职场文书
2019XX公司员工考核管理制度!
2019/08/07 职场文书