代码前: for循环应运行至少143,792,640,000次,并创建表至少生成563,760行而不重复 我想知道如何加速或像Hadoop这样可以在php和MySQL之间加速的并行计算。
以下代码:
MySQL连接
$link=mysql_connect($servername,$username,$password);
mysql_select_db($dbname);
$sql= "INSERT INTO EM (source,target) VALUES ";
for循环读取数据到MySQL检查函数,如果重复不插入并更新count = count + 1
for($i=0;$i<$combine_arr_size;$i++){
for($j=0;$j<$combine_arr_size;$j++){
//下面检查是否找到重复的像a,b我们认识b,a是同一件事
if(check($combine_words_array[$i],$combine_words_array[$j])) {
$update_query="UPDATE EM SET count = count+1 where (source='$combine_words_array[$i]' AND target='$combine_words_array[$j]') OR (source='$combine_words_array[$j]' AND target='$combine_words_array[$i]');";
mysql_query($update_query);
} else {
if (!$link) {
die("Connection failed: " . mysql_error());
}
//使用insert into table()值来连接字符串
$sql.="('$combine_words_array[$i]','$combine_words_array[$j]'),";
mysql_query(substr($sql,0,-1));
$sql= "INSERT INTO EM (source,target) VALUES ";
}
}
}
从comebine_word_array[]
到combine_word_array[]
下面是检查功能,检查是否找到对返回值
function check($src, $trg) {
$query = mysql_query("SELECT * FROM EM WHERE (source='$src' AND target='$trg') OR (source='$trg' AND target='$src');");
if (mysql_num_rows($query) > 0) {
return 1;
} else {
return 0;
}
}
表
+--------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+-------+
| source | varchar(255) | YES | | NULL | |
| target | varchar(255) | YES | | NULL | |
| count | int(11) | NO | | 0 | |
| prob | double | NO | | 0 | |
+--------+--------------+------+-----+---------+-------+
现在php代码只影响源,目标和计数
答案 0 :(得分:0)
在服务器上放置一个更好的处理器并增加RAM,然后转到php.ini设置并为所有各种内存/处理器相关配置提高最大分配内存。
这将进一步增强服务器的能力并提高运行效率。
如果找不到php.ini文件。创建一个包含以下内容的新php文件,并在浏览器中打开它:
<?php phpinfo(); ?>
确保在找到php.ini所在的位置后删除此文件...因为不需要的用户(黑客)可以找到此文件,它会向他们提供导致服务器配置漏洞的详细信息。
一旦你找到了php.ini,就可以在线查看一些不明显的设置并增加各个区域的内存分配。
答案 1 :(得分:0)
很难确切地知道您想要对重复组合做什么。例如,你得到了数组的每个组合,这将获得许多重复项,然后你将计算两次。
但是我很想把这些单词加载到一个表(可能是临时表)中,然后对表进行交叉连接以获得每个组合,并使用它来执行带有重复键子句的INSERT
非常粗暴,像这样: -
<?php
$sql = "CREATE TEMPORARY TABLE words
(
word varchar(255),
PRIMARY KEY (`word`),
)";
$link = mysql_connect($servername,$username,$password);
mysql_select_db($dbname);
$sql = "INSERT INTO words (word) VALUES ";
$sql_parm = array();
foreach($combine_words_array AS $combine_word)
{
$sql_parm[] = "('".mysql_real_escape_string($combine_word)."')";
if (count($sql_parm) > 500)
{
mysql_query($sql.implode(',', $sql_parm));
$sql_parm = array();
}
}
if (count($sql_parm) > 0)
{
mysql_query($sql.implode(',', $sql_parm));
$sql_parm = array();
}
$sql = "INSERT INTO EM(source, target)
SELECT w1.word, w2.word
FROM words w1
CROSS JOIN words w2
ON DUPLICATE KEY UPDATE `count` = `count` + 1
";
mysql_query($sql);
这确实依赖于包含源列和目标列的唯一键。
但是否这是一个选项取决于记录的细节。例如,如果有2个单词(例如A和B),您可以找到组合A / B和组合B / A的当前代码。但两种组合都会更新相同的记录