php 按多标签重合度筛选,匹配csdn用户数据库与官方用户的重合度并将重叠部分的用户筛选出来_php实例...

博客讨论了在Windows和Linux环境下导入大量用户数据到MySQL时遇到的问题,包括EditPlus内存不足和数据丢失。通过调整代码和参数,如分页大小($perpage),对比了MyISAM和InnoDB引擎的性能差异。发现先导入数据后加索引比先加索引后导入更高效,InnoDB插入效率低于MyISAM。最终优化的代码将对比过程从10多个小时缩短到25分钟,找出重名用户34175,占总用户的1.7%。

过程:

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打开文件是写入缓存的,但是实践证明速度很快,应该是没有写入缓存,以下为导入数据的代码

复制代码 代码如下:

以上代码效率非常差,故做修改后代码如下:

复制代码 代码如下:

为了搞清楚有那些因素对导入数据的效率产生影响,故根据不同的设置进行了测试

优快云用户总数据 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、对比筛选用户

对比程序写好了,切记在命令行下运行:

复制代码 代码如下:

您看到的以上的代码是非常蹩脚的,因为其效率特别低 ,几百万的数据,要跑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'].' 优快云:'.$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中文网,转载请注明出处,感谢您的尊重!

相关文章

相关视频

网友评论

文明上网理性发言,请遵守 新闻评论服务协议我要评论

47d507a036d4dd65488c445c0974b649.png

立即提交

专题推荐064df72cb40df78e80e61b7041ee044f.png独孤九贱-php全栈开发教程

全栈 100W+

主讲:Peter-Zhu 轻松幽默、简短易学,非常适合PHP学习入门

7dafe36c040e31d783922649aefe0be1.png玉女心经-web前端开发教程

入门 50W+

主讲:灭绝师太 由浅入深、明快简洁,非常适合前端学习入门

04246fdfe8958426b043c89ded0857f1.png天龙八部-实战开发教程

实战 80W+

主讲:西门大官人 思路清晰、严谨规范,适合有一定web编程基础学习

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值