silmarion
Полезный
- Регистрация
- 21 Июн 2012
- Сообщения
- 194
- Реакции
- 19
- Автор темы
- #1
Доброго дня, в общем уже несколько дней мучаюсь вопросом.
Есть огромная база(200кк)
вида
id;author;book
id;author;book
id;author;book
мне присылают файлы вида list.txt
издательство:автор
издательство:автор
издательство:автор
Нужно брать из файла колонку 'книга'
делать поиск по базе по автору
и сохранять если найдено совпадение по колонке автор в файл found.txt
издательство:книга
издательство:книга
издательство:книга
а если не найдено, то сохранять в файл not_found.txt
издательство:автор
издательство:автор
издательство:автор
Набросал скрипт для этого, но пипец как всё медленно идет, рылся по форумам по поводу многопоточного select и т.п. но толком ничего не вышло из этого.
Вот пример скрипта
Как всё это дело ускорить?
Потому что ну оооооочень долго выборка идет.
Пишут на форумах что можно подобное запускать в много потоков и т.п.
Но как реализовать не нашел.
Есть огромная база(200кк)
вида
id;author;book
id;author;book
id;author;book
мне присылают файлы вида list.txt
издательство:автор
издательство:автор
издательство:автор
Нужно брать из файла колонку 'книга'
делать поиск по базе по автору
и сохранять если найдено совпадение по колонке автор в файл found.txt
издательство:книга
издательство:книга
издательство:книга
а если не найдено, то сохранять в файл not_found.txt
издательство:автор
издательство:автор
издательство:автор
Набросал скрипт для этого, но пипец как всё медленно идет, рылся по форумам по поводу многопоточного select и т.п. но толком ничего не вышло из этого.
Вот пример скрипта
Код:
<?php
set_time_limit(0);
//ini_set('display_errors',1);error_reporting(E_ALL);
$dbhost = "127.0.0.1";$dbuser = "root";$dbpassword = "";$dbname = "i";$link = mysql_connect($dbhost, $dbuser, $dbpassword);mysql_select_db($dbname, $link);
/////////////////////////////////////////////////////
$sqlCount = 0;$sqlTime = 0;$timeStart = microtime( TRUE);
/////////////////////////////////////////////////////
$data = file("find.txt");
$ff = fopen("found.txt", "a");
$nf = fopen("found_not.txt", "a");
for ($i = 0; $i < count($data); $i++) {
$pieces = explode(":", $data[$i]);
$pie = preg_replace("/\s/","",$pieces[1]);
$ath = mysql_query("select `author` from `izd` where `book` = '$pie' LIMIT 1");
$sqlCount++;
if($ath) {
$author = mysql_fetch_array($ath);
if(!empty($author['author'])){
$mytext1 = $pieces[0].":".$author['author']."\n";
$test = fwrite($ff, $mytext1); }
if(empty($author['author'])){
$mytext2 = $pieces[0].":".$pieces[1];
$test = fwrite($nf, $mytext2); }
}
else { echo "<p><b>Error: ".mysql_error()."</b></p>"; exit(); }
}
//////////////////////////////////////////////////////////////
$sqlTime += microtime( TRUE) - $timeStart;
printf( '%d запросов за %01.2f секунд.', $sqlCount, $sqlTime);
/////////////////////////////////////////////////////////////
?>
Как всё это дело ускорить?
Потому что ну оооооочень долго выборка идет.
Пишут на форумах что можно подобное запускать в много потоков и т.п.
Но как реализовать не нашел.