как уменшить время исполнения скрипта

Bicdibus

Участник
Регистрация
5 Мар 2010
Сообщения
497
Реакции
7
Юзаю опенсервер, есть скрипт который создает БД скулайт и записывает туда данные. Записывается около 10к строк и длится это дело около часа. Поставил опенсервер со скриптом на рамдрайв, производительность немного возросла, но не сильно. Можно ли что-то подкрутить в самом опенсервере, чтоб пхп обрабатывал быстрее все это дело? Или на что обратить внимание в самом скрипте, чтоб оптимизировать его. Сам скрипт читает построчно файл, строка вносится в бд, на ее основе выполняются некоторые другие операции(получает данные с хтмл страниц) . Все данные вносятся одним инсертом. Код не выкладываю, так как он большой довольно и без поллитра не разберешся.
 
Если включена опция "Защита от внешнего доступа" отключи ее, она снижает производительность.
 
Отключил, еще какие варианты есть? Хотел на делфи все запилить, но чем curl заменить не знаю

1.5к записей генерится 30мин. это мерзость. Как вариант рассматриваю зносить большынство полей десктопной прогой, а недостающие уже на пхп. Скорость выполнения апдейт в 2-3 поля будет намного быстрей чем инсерт в 6 полей? Есть ли смысл заморачиватся с таким вариантом?
 
Последнее редактирование модератором:
Надо конкретно ковырять скрипт.
Из простых советов — мемкеш+перейти на PHP7 (переход на PHP7 уменьшает потребление памяти и загрузку проца в 2-3 раза).
Сам скрипт читает построчно файл,
Записывается около 10к строк
Имхо такой объём можно считывать сразу в память через file() или file_get_contents()
Все данные вносятся одним инсертом
Если всё равно вносите одним инсертом, непонятно, зачем считываете построчно?
Можно же целиком.
 
на основе строчки генерятся остальные поля, т.е. после считывания строки генерятся данные которые одним инсертом вносятся все крутится в цикле.

что такое мемкеш?
 
Последнее редактирование модератором:
Для просмотра ссылки Войди или Зарегистрируйся
Вот в эту сторону возможно стоит подумать. Должно помочь.

P.S. Имею ввиду
sqlite_query($dbhandle, 'BEGIN;');
sqlite_query($dbhandle, 'COMMIT;');
 
Для начала гуглишь, что такое профайлинг/дебаг в php и какие для него есть скрипты, потом определяешь кусок кода с максимальным временем и минимальной вложенностью.
А дальше, если не знаешь как этот кусок ускорить, давай его сюда попробуем помочь.

Иных советов быть не может ибо глюк приходит в самых разных и иногда абсолютно неожиданных местах.
В моих личных рекордах рефакторинга лидирует код, на который я бы до сих пор ничего плохого не подумал без дебагера, а ускорение было больше чем в 100 раз.

Для меня лучшая тулза xdebug ( настройка profiler ) для сбора и PhpStorm (Tool -- Для просмотра ссылки Войди или Зарегистрируйся) для просмотра и анализа.
 
на основе строчки генерятся остальные поля, т.е. после считывания строки генерятся данные которые одним инсертом вносятся все крутится в цикле.

что такое мемкеш?
У тебя выполняется один insert на 10к строк? если нет - то не пиши что один insert.
Как генерятся данные? парсишь что то?
напиши конкретно что делает твой скрипт по шагам или скопируй код и тебе подскажут что можно сделать.
 
$res = $db->query("INSERT INTO post (title,link,cat,img,txt) VALUES ('$key','$link','$cat','$img','$txt)"); єто единственній запрос к бд в скрипте. Куда к нему приписать BEGIN; и COMMIT? Скрипт парсит данные и вносит в бд, парсеры по отдельных файлах разбросаны их 2штуки и 1 генератор чпу.
пишу в пхпдезигнере 8 к нему есть какой-то дебагер? Ну и я понял что лутше загнать весь файл текстовый в массив, а не считывать по строчке.
 
@Bicdibus, BEGIN выполняется ДО SQL-запросов. Говорит серверу что дальше будет пакет, который не надо выполнять сразу. COMMIT идёт после - говорит, что все SQL-команды переданы, можно выполнять. На деле ни разу не использовал, но суть примерно такая.

У меня к тебе встречный вопрос - а почему не использовать MySQL? У меня сервер ежедневно принимает импорты по 100+ тысяч строк и обрабатывает их всего парядка 2-3 минут... И то это я CPU экономлю. В тестовом прогоне на 2 ядрах сожрал где-то за 40 секунд без оптимизации кода и запросов.

єто единственній запрос к бд в скрипте.
1 запрос не может выполняться 30 минут... У тебя 10 тысяч одинаковых запросов...
Делай пакетный запрос (Вот убей не помню тянет ли его SQLite, MySQL точно тянет) - отправляй 100 значений за раз, к примеру... И у тебя уже не 10 000 обращений к SQL серверу, а только 100... Меньше время на авторизацию, получение сессии, открытие таблиц, указание кодировок и т.д.
 
Назад
Сверху