[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Обновление данных
blade
Здраствуйте!

В общем суть в том что, имеется база(в файле) пользователей их там больше 1000
так вот нужно всех их занести в БД ну выполнять сразу столько запросов это очень большая нагрузка, как сделать чтоб скрипт выполнятся пока всех пользователей не перенесет в БД, выполнял по 5-10 записей за 1 раз затем останавливался на несколько секунд и снова продолжал работу по тем же условиям занес 5-10 записей приостановился, а не начинал выполнятся заново ?

Так?

$list = file("list.php");

for($i = 0; $i != 5; $i ++)
{
// Записываем в БД 5 записей


sleep(5); // Останавливаем на 5 секунд и продолжаем далее
}




Спустя 30 минут, 10 секунд (10.11.2010 - 13:34) Sanchopansa написал(а):
$list = file("list.php");

for($i = 0; $i < count($list); $i ++)
{
//пишем в БД

if(!($i+1)%5) sleep(5); // Останавливаем на 5 секунд и продолжаем далее
}

Спустя 1 минута, 9 секунд (10.11.2010 - 13:35) sergeiss написал(а):
Цитата (blade @ 10.11.2010 - 14:03)
так вот нужно всех их занести в БД ну выполнять сразу столько запросов это очень большая нагрузка

Выкинь такую БД, для которой 1000 запросов - запредельная нагрузка smile.gif

И еще. Если ты "заливаешь" новые данные, то тогда сохрани их все в файл (не запросы, а только данные), а затем загрузи этот файл в БД одной командой. В любой БД есть такая возможность, только названия команд разные для разных БД.
1000 строк загрузится за одно мгновение.

Спустя 12 минут, 58 секунд (10.11.2010 - 13:48) blade написал(а):
нет мне нужно именно заносить сразу из файла и количество строк в файле исходнике с каждым днем меняется т.е старые удаляются а новые добавляются

Спустя 2 часа, 31 минута, 43 секунды (10.11.2010 - 16:19) sergeiss написал(а):
Цитата (blade @ 10.11.2010 - 14:48)
мне нужно именно заносить сразу из файла

Так а в файле-то что??? "Чистые" данные или уже готовые команды INSERT?????????

Спустя 5 часов, 6 минут, 56 секунд (10.11.2010 - 21:26) kirik написал(а):
blade
sleep-то зачем? Типа "дать БД отдохнуть немного"? smile.gif
Я вчера копировал данные из одной БД в другую - просто в цикле. 200к записей - не одного перекура! smile.gif
Воспользуйся советом sergeiss'а, не нужно писать своего решения.

Спустя 27 минут, 5 секунд (10.11.2010 - 21:54) Sanchopansa написал(а):
ну как просили так и реализовали wink.gif

Спустя 1 час, 37 минут, 45 секунд (10.11.2010 - 23:31) blade написал(а):
В файлах данные численные и нужно отправить запрос на сайт(совсем другой) спарсить данные если все успешно то записать в БД и если там больше 1000 записей то это убийство! у меня на локалхосте все виснет как только нажимаю начать перенос!

Спустя 18 минут, 14 секунд (10.11.2010 - 23:49) sergeiss написал(а):
Цитата (blade @ 11.11.2010 - 00:31)
В файлах данные численные и нужно отправить запрос на сайт(совсем другой) спарсить данные если все успешно то записать в БД...

ЗначиЦЦа, смотри...
Подобной хренью занимается и мой сайт smile.gif Там еженощно грузится статистика. Десятками тысяч строк в общей сумме. С одного файла - тысячами строк. Файл двоичный, не текстовый. Данные пишутся в текстовый файл, затем грузятся в БД одной командой (ну, то есть каждый файл одной командой smile.gif; а всего несколько тысяч файлов, т.е. несколько тысяч команд на загрузку), как я тебе уже описал.
Файлы получаются объемом от нескольких КБ до где-то 500 КБ, несколько тысяч строк. На полный цикл обработки файла уходит от нескольких мгновений до нескольких секунд. И это при том, что в итоговых таблицах уже от нескольких миллионов до десятков миллионов записей! И данные грузятся, и индексы обновляются.

Короче говоря, попробуй сделать так, как я сказал. Не изобретай велосипед smile.gif
Плюс к этому, ответь на вопросы: есть ли на таблице индексы, есть ли на таблице триггеры, да и скажи наконец, какая же БД используется smile.gif

Спустя 1 час, 44 минуты, 55 секунд (11.11.2010 - 01:34) blade написал(а):
Вот сама БД

CREATE TABLE IF NOT EXISTS `units` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(40) NOT NULL,
`email` varchar(150) NOT NULL,
`ip` varchar(15) NOT NULL,
`uin` int(11) NOT NULL,
PRIMARY KEY (`id`)
)
ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;

Спустя 8 часов, 7 минут, 54 секунды (11.11.2010 - 09:42) sergeiss написал(а):
И еще. Покажи код, которым ты записываешь. Возможно, что ты каждый раз открываешь соединение с БД или еще что-то такое делаешь, что делать не надо.

Спустя 1 час, 35 минут, 23 секунды (11.11.2010 - 11:18) blade написал(а):
ну вот как то так!

<?php
# Подключаемся к БД
include("db.php");

# Подключаем список с данными
$list = file("list.php");

# Создаем цикл который перебирает весь список
for($i = 0; $i != count($list); $i++)
{
# Подставляем значения и парсим
$content = file_get_contents("http://сайт.ру/unit.php?n=".$list[$i]);

# Если количество символов больше 0 значит все нормально такие данные есть заносим информацию в БД
if (strlen($content) > 0)
{
$sql = "INSERT INTO units (uin) VALUES ('$list[$i]')";
$mysql_query = mysql_query($sql) or die();
}
}


# закрываем соединение с БД
mysql_close();
?>


Я так думаю что виснет из-за того сайта с которого беру информацию т.к страница весит не 1 килобайт хотя я и не вывожу данные на экран но браузер то подгржает страницу!

Спустя 13 минут, 44 секунды (11.11.2010 - 11:31) sergeiss написал(а):
Я с тебя фигею... Тут проверить всё просто, и скорее всего ты прав, что проблема именно в получении данных.

Вместо
        $sql = "INSERT INTO units (uin) VALUES ('$list[$i]')";
$mysql_query = mysql_query($sql) or die();

напиши
echo $i.' : '. $list[$i].' : '.date( 'H:i:s' ).'<br>';

и посмотри, насколько быстро у тебя будут обрабатываться данные.

Результат - в студию!!!


Плюс к этому, условие $i != count($list) "некрасивое". Лучше будет написать начало цикла так
for($i = 0; $i < count($list); $i++)

Спустя 26 минут, 53 секунды (11.11.2010 - 11:58) blade написал(а):
на каждую запись уходит 1 секунда

Спустя 13 минут, 28 секунд (11.11.2010 - 12:12) sergeiss написал(а):
А если добавить еще и запись в БД, то время одного цикла не должно заметно измениться, потому что запись одной строки занимает мгновение. Оставь вывод времени и опять верни обратно в скрипт записа в БД.

У тебя более 1000 строк. Нужно не менее 1000 секунд на всю обработку, верно? Это порядка 17 минут.
Установи в начале скрипта бесконечное время ожидания set_time_limit(0) и запускай обработку. Ну, и расскажи потом, что получилось...

Спустя 1 час, 41 минута, 32 секунды (11.11.2010 - 13:53) blade написал(а):
тоже по секунде!

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

Спустя 17 минут, 22 секунды (11.11.2010 - 14:11) sergeiss написал(а):
Ты считаешь, что это "нагрузка" - 1 запись в БД в секунду??? blink.gif

Для того, чтобы что-то изменить, ты можешь, например сказанное мной ранее про загрузку из файла в БД ты можешь использовать. Просто пиши данные в процессе работы в файл, а потом загружай его в БД.
Второй вариант - пишешь нужные данные в массив, а в конце обработки формируешь набор команд, которые будут вносить изменения в таблицу (без промежуточной записи данных в файл). Этот набор команд "пролетит" быстро.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.