匹配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基础知识:类与对象(1)
Dec 13 PHP
基于asp+ajax和数据库驱动的二级联动菜单
May 06 PHP
按上下级层次关系输出内容的PHP代码
Jul 17 PHP
ajax在joomla中的原生态应用代码
Jul 19 PHP
php递归使用示例(php递归函数)
Feb 14 PHP
支付宝服务窗API接口开发php版本
Jul 20 PHP
PHP面试常用算法(推荐)
Jul 22 PHP
thinkphp5.0自定义验证规则使用方法
Nov 16 PHP
Laravel框架实现多数据库连接操作详解
Jul 12 PHP
PHP中的自动加载操作实现方法详解
Aug 06 PHP
PHP命名空间定义与用法实例分析
Aug 14 PHP
解决在laravel中auth建立时候遇到的问题
Oct 15 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下编码转换函数mb_convert_encoding与iconv的使用说明
2009/12/16 PHP
PHP,ASP.JAVA,JAVA代码格式化工具整理
2010/06/15 PHP
PHP使用正则表达式获取微博中的话题和对象名
2015/07/18 PHP
PHP INT类型在内存中占字节详解
2019/07/20 PHP
ASP.NET jQuery 实例15 通过控件CustomValidator验证CheckBoxList
2012/02/03 Javascript
jquery插件制作教程 txtHover
2012/08/17 Javascript
Jquery实现仿新浪微博获取文本框能输入的字数代码
2013/02/22 Javascript
jquery中页面Ajax方法$.load的功能使用介绍
2014/10/20 Javascript
JavaScript极简入门教程(二):对象和函数
2014/10/25 Javascript
JS实现从顶部下拉显示的带动画QQ客服特效代码
2015/10/24 Javascript
AngularJS实现全选反选功能
2015/12/08 Javascript
js检测离开或刷新页面时表单数据是否更改的方法
2016/08/02 Javascript
angularjs中回车键触发某一事件的方法
2017/04/24 Javascript
深入理解Webpack 中路径的配置
2017/06/17 Javascript
CSS3+JavaScript实现翻页幻灯片效果
2017/06/28 Javascript
JQuery用$.ajax或$.getJSON跨域获取JSON数据的实现代码
2017/09/23 jQuery
nodejs 简单实现动态html的方法
2018/05/12 NodeJs
vue使用v-for实现hover点击效果
2018/09/29 Javascript
微信小程序调用微信支付接口的实现方法
2019/04/29 Javascript
vue中监听返回键问题
2019/08/28 Javascript
vue 中的 render 函数作用详解
2020/02/28 Javascript
python进程管理工具supervisor使用实例
2014/09/17 Python
Python+OpenCV实现车牌字符分割和识别
2018/03/31 Python
Python基于dom操作xml数据的方法示例
2018/05/12 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
2019/01/23 Python
对Python获取屏幕截图的4种方法详解
2019/08/27 Python
python getpass实现密文实例详解
2019/09/24 Python
巴西补充剂和维生素购物网站:Natue
2019/06/17 全球购物
Linux机考试题
2015/07/17 面试题
人事助理岗位职责
2013/11/18 职场文书
公关关系专员的自我评价分享
2013/11/20 职场文书
装配出错检讨书
2014/09/23 职场文书
办护照工作证明
2014/10/01 职场文书
python Tkinter模块使用方法详解
2022/04/07 Python
单机多实例部署 MySQL8.0.20
2022/05/15 MySQL
CSS使用SVG实现动态分布的圆环发散路径动画
2022/12/24 HTML / CSS