2015-07-21 2 views
1

Перед тем как код: для цикла должен работать не менее 143,792,640,000 раз и создать таблицу, по крайней мере, произвести 563 760 строк без дублирования Я хочу знать, как ускорить или что-то параллельное таких как Hadoop, которые могли бы ускориться между php и MySQL.Как ускорить запрос PHP к MySQL с большими данными запроса

код ниже:

MySQL соединение

$link=mysql_connect($servername,$username,$password); 
mysql_select_db($dbname); 
$sql= "INSERT INTO EM (source,target) VALUES "; 

цикл чтения данных в функции проверки MySQL, если дубликат не вставлять и количество обновлений = кол + 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()); 
       } 

// иначе, используя вставку в таблицу() значение для конкатенации Строки

$sql.="('$combine_words_array[$i]','$combine_words_array[$j]'),";  
      mysql_query(substr($sql,0,-1)); 
      $sql= "INSERT INTO EM (source,target) VALUES ";   
     } 
    } 
} 

Прочитайте весь вектор Align от 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 только влияет на источник, цели и рассчитывать

+1

143B строк, фу! Как долго это займет ваше производственное оборудование в настоящее время? ':-)' Я полагаю, что многие из них могут быть преобразованы в хранимую процедуру, и это будет работать намного быстрее. Попробуй это первым, может быть? – halfer

+0

Кроме того, можете ли вы добавить к своему вопросу объяснение псевдокода этого алгоритма и что он делает? Возможно, вы делаете что-то действительно неэффективно, и есть лучший/более быстрый способ сделать это. – halfer

+0

(Исправление: 143B итераций, а не строк. Еще много работы!) – halfer

ответ

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. Но обе комбинации будут обновлять одни и те же записи

+0

ok = = я попробую это первым –

0

Положите лучший процессор на сервере и увеличить оперативную память, а затем перейти к настройкам php.ini и поднять максимальную распределенную память для все различной памяти/процессор относительной конфигурации.

Это расширит возможности сервера и улучшит эффективность работы.

Если вы не нашли свой файл php.ini. Создайте новый файл PHP со следующим содержимым и откройте его в браузере:

<?php phpinfo(); ?> 

Убедитесь, что вы удалите этот файл после выяснить, где php.ini это ... как нежелательный пользователь (хакер) мог найти это файл, и он предоставит им подробную информацию, ведущую к уязвимостям в конфигурации вашего сервера.

После того, как вы нашли php.ini, выполните некоторые функции онлайн, чтобы определить параметры, которые не очевидны, и увеличить выделение памяти в различных областях.

+0

memory_limit установлен в значение -1, так что это не будет ограничено, но все равно будет работать более 3 месяцев –

+0

«нежелательный пользователь (хакер) может найти этот файл [phpinfo script]» - я не представляю такой скрипт будет доступным через Интернет. Его следует запускать с консоли, так как сценарий OP также будет консольным. – halfer

+0

Вы будете удивлены, как много людей покидают файл phpinfo.php на своем веб-сайте случайно. Раньше я не запускал его в консоли, но посмотрю на него. Спасибо за совет. –

Смежные вопросы