не могу оптимизировать алго

domino

Новичок
не могу оптимизировать алго

Помогите плз, оптимизировать алго. А то чего-то не получается :(((
PHP:
$stopper = -1;

for($i=0; $i<sizeof($products_info); $i++)
{
$prod_id = $products_info[$i][0];
$prod_psevdo = $products_info[$i][4];



for($j=0; $j<sizeof($all_res); $j++)
{
	foreach($all_res[$j] as $name => $data)
	{

	if((strtolower($name)=='id') && ($data==$prod_psevdo)) { $stopper = $j; continue; }

		if(($stopper!=-1) && ($stopper==$j))
		{
			for($m=0; $m<sizeof($properties_info); $m++)
			{
				if(strtolower($name)==$properties_info[$m][2])
				{
				$prop_id = $properties_info[$m][0];
				$prop_value = addslashes($data);

				$query_8 = "insert into properties_values values(NULL, $prop_id, $prod_id, '".$prop_value."')";
				$db_routine->query($query_8);
				$db_routine->free_result($db_routine->query_id); // освободили память

				break;
				}

			}

		}





	}

if($stopper!=-1) {$stopper = -1;  break;}
}


}
-~{}~ 13.03.06 21:05:

Если не в тот форум написал - сорри. В описании вроде было написано - алгоритмы.
 

vadim

Guest
вы сначало расскажите, что в вашем решении не нравится
 

Develar

Новичок
и о версии PHP, MySQL.
Без знания что делает алгоритм и в каких условиях невозможно сказать что-то определенное. К примеру, можно рекомендовать использовать вместо запроса INSERT в каждой итерации один большой в конце работы алгоритма - а может памяти не хватит на хранение и т. д. и т. п.
 

vadim

Guest
Сразу первое замечание: Четыре вложенных друг в друга цикла - это просто ужас!!!!
 

domino

Новичок
vadim: что именно тебя испугало? или 3 вложенных цикла - это ок, а 4 - это уже ужас? :) Предлагай свой вариант. а бояться нечего.
Develar: пхп по условию 4.4.0, мускул <= 4. сама задача заключается в том, что есть xml примерно на полтора метра, но это в среднем. есть файлы и по 2 м. и по 500 кило. это дело распарсивается классом, наследником от Pear. дальше, данные надо сложить в БД.
$products_info - числовой двумерный массив, в котором лежат данные о продуктах:
[0] - id - key
[1] - group_id
[2] - producer
[3] - model
[4] - psevdo_id - то же самое, что и id, но берётся из файла, поэтому вынесено в отдельную колонку. ну, мало ли... может секретарша с ошибкой набъёт...

$all_res - это смешанный массив с распарсенными данными о продуктах
[ТЭГ] = ЗНАЧЕНИЕ_ТЭГА например <grp>smartphones</grp>

эта строка -
PHP:
if((strtolower($name)=='id') && ($data==$prod_psevdo)) { $stopper = $j; continue; }
добавлена потому, что не надо сохранять id в таблице свойств, но надо знать с какого места начинать закидывать в БД данные с нужным id

$properties_info - массив свойств. это данные, которые определены в xml. типа - <params><param id='group'>группа товара</param><param id='price'>цена товара</param> .....</params>

$db_routine - объект класса для работы с базой

база определан так:
4 таблицы:
1. groups(id(int key), name(char), items_num(int), modified(date))
2. products(id(int key), group_id(int), producer(char), model(char), psevdo_id(int), added(date), modified(date))
producer и model можно узнать и из других таблиц, но тут они добавлены, чтобы можно было быстро вывести краткую инфу, а не копаться в свойствах
3. properties(id(int key), ) // хоть убей не помню чего там дальше - код на работы :) но это не супер важно
4. properties_values(id(int key), prop_id(int ссылка на properties), prod_id(int ссылка на products), value(char))

Собственно, этот кусок кода отвечает за корректную вставку данных в таблицу properties_values(), которая хранит значение свойства и ссылки на продукты и свойства. в свойствах хранится само свойство и ссылки на группу по моему, т.е. какой группе товара принадлежит свойство.

2 оператора break и 1 continue дают в среднем ускорение на 15%-20%, но скрипт всё равно отваливается по exec time - putenv() юзать запрещено.
 

Develar

Новичок
Раз нет доступа к SSH и установке лимита времени выполнения, то очевидно, что надо разбить задачу на шаги.
1) сначала анализируем данные и сохраняем полученный массив $products_info во временный файл. Причем в массиве только те данные, которые нужны. Зачем в каждой итерации проверять данные, если можно это сделать за один раз? Данные можно сохранить и в формате пригодном для LOAD DATA
2) Если хостер разрешает LOAD DATA - на втором шаге скрипта загружай с его помощью данные в БД, если нет, используй многострочную форму INSERT INTO - именно многострочную (доступно с 4).

Если скрипт не отрабатывает за положенные секунды - попробуй разные размеры блоков обрабатываемых данных.
 

domino

Новичок
Devlar:
сначала анализируем данные и сохраняем полученный массив $products_info во временный файл. Причем в массиве только те данные, которые нужны.
В этом цикле ВЫЧИСЛЯЮТСЯ данные, которые нужно записать в properties_values из массива $properties_info и $products_info. какой смысл это всё писать в файл, а потом в БД, если можно сразу в БД без файла??
 

Develar

Новичок
domino
так у тебя не php-cli, ты же писал, что ограничен 30 с. Вот и извращаемся.
Хостера надо выбирать хорошего. Или же он все-таки дает SSH?
К тому же, если тебе недоступен многострочный INSERT, то необходим LOAD DATA - а он работает с существующими файлами.
 

domino

Новичок
из кода видно, что строка в properties_values - это значения из трёх массивов - $prod_id из $products_info - ссылка на таблицу продуктов, $prop_id из $properties_info - ссылка на таблицу properties и $data из $all_res -одного большого массива со всеми распарсенными данными - это собственно данные.

-~{}~ 14.03.06 00:54:

да хостер тут не при чём :)
 

Develar

Новичок
Если хостер не причем, то какие тогда проблемы? Запусти скрипт как php-cli и все.
 
Сверху