ホームページ  >  記事  >  php教程  >  csdn ユーザー データベースと公式ユーザーの重複を照合し、重複するユーザーを除外します

csdn ユーザー データベースと公式ユーザーの重複を照合し、重複するユーザーを除外します

WBOY
WBOYオリジナル
2016-06-13 12:03:131095ブラウズ

プロセス:
1. csdn のユーザー データベースを取得し、ローカルにインポートします
editplus を開こうとすると、メモリが不足しているというメッセージが表示され、方法が見つかりません。私の同僚は Linux でそれを確認しましたが、基本的な形式は次のとおりです。次のように:
ユーザー名 # パスワード # 電子メール
ユーザー名# パスワード# 電子メール
対応するデータ構造:

コードをコピー コードは次のとおりです


CREATE TABLE IF NOT EXISTS `csdn_userdb` (
`id` int(10) NOT NULL auto_increment,
`username` varchar(50) 文字セット gbk NOT NULL,
`password` varchar(50) 文字セット gbk NOT NULL、
`email` varchar(50) 文字セット gbk NOT NULL、
PRIMARY KEY (`id`)、
KEY `username` (`username`),
KEY `email` (`email`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk AUTO_INCREMENT=1;


fopen がファイルを開くのではないかとずっと疑っていました。データをインポートするコードは次のとおりです

コードをコピーします コードは次のとおりです。


$ link = mysql_connect('localhost', 'root', 'admin', true); 'csdn',$link);
$handle = fopen("C:UserszhudongDesktopwww.csdn.net.sql ", "r");
while (!feof($handle)){
$ i ;
$buffer = fgets($handle);
list($u,$p,$ e) =explode(" # ",$buffer);
mysql_query("INSERT INTO csdn_userdb(ユーザー名) ,password,email) VALUES ('$u','$p','$e')",$link );
if ($i 00 == 0) echo $i."n";
}
fclose($handle);
?>

上記のコードの効率は非常に低いため、修正されたコードは次のようになります。

コードをコピーします

コードは次のとおりです: $link = mysql_connect('localhost', 'root', 'admin', true);

mysql_select_db('csdn',$link);
$handle = fopen("C:UserszhudongDesktopwww.csdn .net.sql", "r"); = 50;
while (!feof($handle)){
$buffer = fgets($handle) = 爆発(" # ",$buffer);
$insertValue[] = "('$u','$p','$e') ";
if ($i% $perpage == 0) { $perpage == 0){
$insrtValueString = 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、データ損失率: 8%テーブル エンジン: MyISAM; 合計所要時間: 15 分
$perpage=200 の場合、データ損失: 218400; データ テーブル エンジン: MYISAM;はい; 合計所要時間: 30 分
$perpage=200 の場合、データの総数: 218400; データ テーブル エンジン: INNODB; 合計時間所要時間: 65 分
$perpage=200 の場合、インポート後のデータの総数: 218400; データ テーブル エンジン: MYISAM ; 合計所要時間: 14 分(データのインポート後に別途インデックスを再構築します)
$perpage=50 の場合、インポート後のデータの総数: 57400、データ テーブル エンジン: MYISAM、インデックス: なし: 合計所要時間: 20 分
上記の状況に基づく要約は次のとおりです:
1. 最初にデータをインポートしてからインデックスを追加すると、最初にインデックスを追加してからデータをインポートするよりも 2 倍効率的です

2単一プロセスのデータ挿入における InnoDB の効率は、MYISAM
3 の効率よりもはるかに低くなります。perpage=50 の場合、データ損失率は 1% 未満です



Copy code

コードは次のとおりです。


ブラウザから実行するとタイムアウトの問題が発生し効率が悪いため、コマンドラインで実行します。プロセス中に少しトラブルが発生し、遅れました。時間がかかりませんでした。
最初に次のコードを実行しました:
php.exe E:usrwwwimportcsdndb.php

しかし、エラーが報告され続けました: call to unknown function mysql_connect 苦労した結果、php.ini がロードされていないことがわかりました。正しいコード: php.exe -c E:/usr/local/apache2/php.ini importcsdndb.php

2. ローカルの
コマンド ラインに一致させる必要があるユーザー データをインポートします。msyql と入力します (Baidu の使用方法がわかりません)
次に、mysql>source C: を実行します。 /Users/zhudong/Desktop/userdb.sql
3. ユーザーの比較とフィルタリング
比較プログラムを作成したら、次の行の下の Run コマンドに忘れずに追加してください。
コードをコピーします

コードは次のとおりです:


$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[ 'ユーザー名'] == $ユーザー名) {
$ユーザー名_番号 ;
fwrite($handle_username,'OWN:'.$rt['uid'].'|'.$rt['username'].'|'.$rt['password'].'|'.$ rt['電子メール'].' CSDN:'.$rt2['ユーザー名'].'|'.$rt2['パスワード'].'|'.$rt2['電子メール']."rn");
エコー 'username_num='.$username_num."rn";
続き;
}
/*
if ($rt2['email'] == $email) {
$email_num ;
fwrite($handle_email,'OWN:'.$rt['uid'].'|'.$rt['username'].'|'.$rt['password'].'|'.$ rt['電子メール'].' CSDN:'.$rt2['ユーザー名'].'|'.$rt2['パスワード'].'|'.$rt2['電子メール']."rn");
エコー 'email_num='.$email_num."rn";
}
*/
}
}
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$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.uidwhile ($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['電子メール'].' CSDN:'.$rt['ユーザー名'].'|'.$rt['csdn_password'].'|'.$rt['csdn_email']."rn");
エコー 'username_num='.$username_num."rn";
}
}
$uid = $nextuid;
エコー 'uid='.$uid;
}
?>


总对比時間25分钟,相比较之前10数回的执行真是大有提升
总重名用户:34175
占总会员率:1.7%
1.7% の重名ユーザーも非常に多く、本サイトのユーザーよりも各サイトの長さに対して本書で支援することが望ましい
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。