ホームページ  >  記事  >  バックエンド開発  >  csdn ユーザー データベースと公式ユーザーの重複を照合し、重複するユーザーを除外する_PHP チュートリアル

csdn ユーザー データベースと公式ユーザーの重複を照合し、重複するユーザーを除外する_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:21:56892ブラウズ

プロセス:
1. csdn のユーザー データベースを取得し、ローカルにインポートします。
edi​​tplus を開こうとすると、Linux で確認する方法が見つかりませんでした。は次のとおりです:
Username# Password# Email
Username# Password# Mailbox
対応するデータ構造:

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

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);
mysql_select_db('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("csdn_userdb(ユーザー名,パスワード,電子メール) 値に挿入 ('$u ','$p','$e')",$link); $i%1000 == 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");
$perpage = 50; feof ($handle){
$i++; ($handle);
list($u,$p,$e) =explode(" # ",$buffer);
$insertValue[] = " ('$u','$p','$e' )";
if ($i% $perpage == 0){ $perpage == 0){
$insrtValueString = implode(',',$insertValue );
mysql_query("INSERT INTO csdn_userdb(ユーザー名,パスワード,電子メール) ) VALUES $insrtValueString",$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、インポート後のデータの合計数: 6,210,200、データ損失: 3.3%、データ テーブル エンジン: INNODB、合計消費時間: 65 分、$perpage=200 の場合、インポート後のデータ数: 6,210,200; データ損失: 218400; データ テーブル エンジン: MYISAM; 合計時間: 14 分 (データのインポートが完了した後、個別にインデックスを再構築します) 50、インポート後の総データ数: 6,371,200、データ損失: 57400、損失率: 0.8%、データ テーブル エンジン: MYISAM、合計所要時間: 20 分
上記の状況に基づく要約は次のとおりです。 1. 最初にデータをインポートしてからインデックスを追加する効率は、最初にインデックスを追加してからデータをインポートする場合の 2 倍になります。
2. 単一プロセスのデータ挿入における InnoDB の効率は、MYISAM の効率よりも大幅に低くなります。 =50 この場合、データ損失率は 1% 未満です



コードをコピーします

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


ブラウザ経由で実行するとタイムアウトの問題が発生し、効率が低いためです。このプロセス中に、少しのトラブルが発生し、かなりの時間がかかりました
最初に次のコードを実行しました:
php.exe E:usrwwwimportcsdndb.php
しかし、エラーが報告され続けました。未定義の関数 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. ユーザーを比較およびフィルターします
比較プログラムが作成されています。忘れずにコマンドラインで実行してください:



コードをコピーします

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

$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[ '電子メール'].' CSDN:'.$rt2['ユーザー名'].'|'.$rt2['パスワード'].'|'.$rt2['電子メール']."rn");
echo '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");
echo '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<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[ '電子メール'].' CSDN:'.$rt['ユーザー名'].'|'.$rt['csdn_password'].'|'.$rt['csdn_email']."rn");
echo 'username_num='.$username_num."rn";
}
}
$uid = $nextuid;
echo 'uid='.$uid;
}
?>

总对比時間25分、相比较前10数回の実行真是大有提升
总重名用户:34175
占总会员率:1.7%
1.7%の重名用户も挺严重い、希望本文では各位局に比べて本局の利用者に役立つ支援を提供します

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/324851.html技術記事手順: 1、获取csdnの用用データベース库导入本地试用editplus打开示唆内存不足,不找到办法,同事的linux下查看了一下,基本的格式如下: 用户名...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。