匹配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 相关文章推荐
一个更简单的无限级分类菜单代码
Jan 16 PHP
wiki-shan写的php在线加密的解密程序
Sep 07 PHP
php代码收集表单内容并写入文件的代码
Jan 29 PHP
php调用MySQL存储过程的方法集合(推荐)
Jul 03 PHP
浅析PHP程序设计中的MVC编程思想
Jul 28 PHP
php+xml编程之xpath的应用实例
Jan 24 PHP
Yii开启片段缓存的方法
Mar 28 PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
May 30 PHP
php变量与数组相互转换的方法(extract与compact)
Dec 02 PHP
yii2安装详细流程
May 23 PHP
php微信公众号开发之翻页查询
Oct 20 PHP
YII2框架中actions的作用与使用方法示例
Mar 13 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
咖啡与牛奶
2021/03/03 冲泡冲煮
PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
2014/06/12 PHP
php防止伪造的数据从URL提交方法
2014/06/27 PHP
自编函数解决pathinfo()函数处理中文问题
2014/11/03 PHP
Windows下Apache + PHP SESSION丢失的解决过程全纪录
2015/04/07 PHP
php实现网站文件批量压缩下载功能
2015/10/28 PHP
短信提示使用 特效
2007/01/19 Javascript
按给定几率进行随机抽取的js代码
2010/12/28 Javascript
js调试系列 断点与动态调试[基础篇]
2014/06/18 Javascript
javascript创建动态表单的方法
2015/07/25 Javascript
41个Web开发者必须收藏的JavaScript实用技巧
2016/07/22 Javascript
bootstrap table之通用方法( 时间控件,导出,动态下拉框, 表单验证 ,选中与获取信息)代码分享
2017/01/24 Javascript
基于wordpress的ajax写法详解
2018/01/02 Javascript
使用JSON格式提交数据到服务端的实例代码
2018/04/01 Javascript
微信小程序自定义对话框弹出和隐藏动画
2018/07/19 Javascript
Vue框架里使用Swiper的方法示例
2018/09/20 Javascript
Angular父子组件通过服务传参的示例方法
2018/10/31 Javascript
JavaScript变速动画函数封装添加任意多个属性
2019/04/03 Javascript
超详细的5个Shell脚本实例分享(值得收藏)
2019/08/15 Javascript
layer页面跳转,获取html子节点元素的值方法
2019/09/27 Javascript
vue限制输入框只能输入8位整数和2位小数的代码
2019/11/06 Javascript
解决vue里a标签值解析变量,跳转页面,前面加默认域名端口的问题
2020/07/22 Javascript
详谈python http长连接客户端
2017/06/12 Python
Python3实现发送QQ邮件功能(附件)
2020/12/23 Python
numpy中矩阵合并的实例
2018/06/15 Python
详解Django的CSRF认证实现
2018/10/09 Python
Python FFT合成波形的实例
2019/12/04 Python
Python判断字符串是否为合法标示符操作
2020/09/03 Python
Expedia英国:全球最大的在线旅游公司
2017/09/07 全球购物
Mio Skincare英国官网:身体紧致及孕期身体护理
2018/08/19 全球购物
高一自我鉴定
2013/12/17 职场文书
移交协议书
2014/08/19 职场文书
交警作风整顿剖析材料
2014/10/11 职场文书
MongoDB 常用的crud操作语句
2021/06/20 MongoDB
Nginx使用ngx_http_upstream_module实现负载均衡功能示例
2022/08/05 Servers
css清除浮动clearfix:after的用法详解(附完整代码)
2023/05/21 HTML / CSS