@User782

Каким способом можно ускорить выполнение скрипта по поиску похожих записей и их удаление из базы (пример скрипт в вопросе)?

Скрипт выполняется очень долго. Три миллиона записей будут обрабатываться месяцы.
Делаю удаление похожий записей таким скриптом.
Суть скрипта. Берем записи по порядку по id и сверяем их со всеми записями, если процент показывает схожесть, сверяемые записи удаляются.

//берем записи по порядку и пробегаем базу
$row_res = mysql_query("SELECT id, title FROM blog WHERE st = 0 ORDER by id");

         while ($row = mysql_fetch_assoc($row_res)) {

                   $str = $row['title'];    
 
                   //ставим в базу 2, означает - запись уже обработана
                   mysql_query("UPDATE blog SET st = 2 WHERE id = $row['id']");



                              //пробегам все записи и сверяем с взятой записью
                              $rows_res = mysql_query("SELECT id, title FROM blog WHERE st = 0 ORDER by id");

                                               while ($rows = mysql_fetch_assoc($rows_res)) {

                                                         $sim = similar_text($row['title'], $rows['title'], $perc);
                                                         $sims = round($perc);
                                                         if($sims > 73) {mysql_query("DELETE FROM blog WHERE id = $rows['id']");}
}
}


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

Есть ли способ ускорить?
  • Вопрос задан
  • 128 просмотров
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Считать разом все пары (`id`, `title`) в ассоциативный массив, обработать его, занося в новый массив id уникальных записей, затем порциями, например по сотне id, установить признак уникальности в базе, потом удалить все записи, где этот признак не установлен.
Но всё равно, в худшем случае будет 3 000 000*3 000 000/2 = 4 500 000 000 000 сравнений. Так что, в первую очередь надо ускорять функцию similar_text.
Ответ написан
MANAB
@MANAB
Разрабатываю на C#: Web, Desktop, Gamedev
Перепиши логику similar_text в функцию. Или всю логику удаления в хранимую процедуру. Или хотя бы логику отмечания, чтобы потом дополнительным скриптом удалить, но ты по крайней мере предварительно сможешь узнать, какие именно данные будешь удалять и проверить их перед этим.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы