Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Пользовательская функция перегружается из-за большого массива

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Описание: большой массив замедляет работу функции
Bartezz
Отправлено: 30 Мая, 2012 - 16:09:44
Post Id



Гость


Покинул форум
Сообщений всего: 70
Дата рег-ции: Февр. 2010  


Помог: 1 раз(а)




Есть большой массив примерно 100 000 элементов, каждый из которых строка длинной 50-200 символов. При использовании этого массива в пользовательской функции (и через global и через передачу параметров) скорость работы скрипта замедляется в десятки раз, если его вынести за функцию и все операции с ним выполнять вне ее, или же вовсе не создавать пользовательскую функцию, то скорость выполнения нормальная.
Возможно что то неверно в настройках php, использую версию 5.2.12 и выставлено использование памяти 512 мб, выполняется все на локальном компьютере под денвером

Кто-нибудь может подсказать как решить эту проблему?

(Отредактировано автором: 30 Мая, 2012 - 16:11:56)

 
 Top
eai
Отправлено: 30 Мая, 2012 - 16:17:14
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 521
Дата рег-ции: Сент. 2009  
Откуда: Петроград


Помог: 10 раз(а)




Подумай об использовании СУБД - это правильно
А чтоб дырку заткнуть передавай параметр по адресу &

(Отредактировано автором: 30 Мая, 2012 - 16:19:42)

 
 Top
tuareg
Отправлено: 30 Мая, 2012 - 16:30:50
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




Вы бы код выложили?
 
 Top
Bartezz
Отправлено: 30 Мая, 2012 - 16:46:30
Post Id



Гость


Покинул форум
Сообщений всего: 70
Дата рег-ции: Февр. 2010  


Помог: 1 раз(а)




tuareg пишет:
Вы бы код выложили?

да тут код особо не имеет значения, для большей наглядности пример:

PHP:
скопировать код в буфер обмена
  1. include_once "some_function.php";
  2.  
  3. // файл который содержит примерно 100 000 строк текста, каждая строка длинной 50-200 символов (ориентировочно)
  4. $file=file("some_file.txt");
  5.  
  6. // функция выполняет выбор нескольких строк (к примеру 50 штук) из массива $file, проводит с ними несложные манипуляции, после чего возвращает строку $output состаящую из этих 50 обработанных элементов
  7. $output=some_function($file);
  8.  
  9. echo $output;

Скрипт выполняется за 3 секунды

Если же весь функционал который заложен в функции вынести за нее (точнее вообще убрать ее вызов и код (которая содержит эта функция) поместить вместо строки ), в результате функционал скрипта останется тот же, однако, в этом случае скрипт выполняется за 0,1-0,2 сек, разница более чем в 10 раз


eai пишет:
А чтоб дырку заткнуть передавай параметр по адресу &

вот это вот не совсем понятно

(Отредактировано автором: 30 Мая, 2012 - 16:49:43)

 
 Top
DlTA
Отправлено: 30 Мая, 2012 - 16:48:35
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




есть такая особенность работы пыхи с массивами, везде где не указано на прямую работать с оригианлом пыха производит перед обработкой копирование массива, а потом обратно,
выходом будет передавать указатель на массив "&$array"
 
 Top
Bartezz
Отправлено: 30 Мая, 2012 - 16:58:05
Post Id



Гость


Покинул форум
Сообщений всего: 70
Дата рег-ции: Февр. 2010  


Помог: 1 раз(а)




eai, DlTA спасибо, попробую таким образом решить проблему

(Отредактировано автором: 30 Мая, 2012 - 16:58:34)

 
 Top
eai
Отправлено: 30 Мая, 2012 - 17:06:16
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 521
Дата рег-ции: Сент. 2009  
Откуда: Петроград


Помог: 10 раз(а)




Это не решение проблемы а затыкание дырки.
Вам что то с архитектурой менять надо, ибо отрабатывать 100000 строк в реквесте это не есть хорошо и не соответствует духу вэб приложения, да в конце концов просто упадет от небольшого наплыва пользователей,
 
 Top
Bartezz
Отправлено: 30 Мая, 2012 - 17:11:15
Post Id



Гость


Покинул форум
Сообщений всего: 70
Дата рег-ции: Февр. 2010  


Помог: 1 раз(а)




eai пишет:
Это не решение проблемы а затыкание дырки.
Вам что то с архитектурой менять надо, ибо отрабатывать 100000 строк в реквесте это не есть хорошо и не соответствует духу вэб приложения, да в конце концов просто упадет от небольшого наплыва пользователей,


никакого большого наплывала пользователей не будет, это веб приложение создано именно для того чтобы обратывать эти строки постоянно, будь то локальный компьютер или выделенный сервер, массив заполняется только в начале работы, после чего (в зависимости от объема) идет обработка данных, запись, архивирование и прочее и этот процесс может продлиться и больше часа если данных на выходе очень много. И работать с этим приложением буду только я, весь сервер буду нагружать только я один. И разумеется этот большой массив не используется единожды, обращение к нему по ходу выполнения происходят тысячи раз, а введение пользовательской функции, которая (по идеи) должна была ускорить работу и облегчить восприятие кода принесла только увеличение времени работы

(Отредактировано автором: 30 Мая, 2012 - 17:14:26)

 
 Top
DeepVarvar Супермодератор
Отправлено: 30 Мая, 2012 - 17:16:21
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Сколько слов из-за одного символа:
PHP:
скопировать код в буфер обмена
  1. $output = some_function(& $file);
 
 Top
eai
Отправлено: 30 Мая, 2012 - 17:26:24
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 521
Дата рег-ции: Сент. 2009  
Откуда: Петроград


Помог: 10 раз(а)




Bartezz пишет:
обращение к нему по ходу выполнения происходят тысячи раз


Если у вас один и тот же файл на каждое обращение грузиться в память то нужно думать о долго живущих объектах.

Рекомендую посмотреть технологию node.js али JavaBeans ну и конечно PHPDeamon
 
 Top
Bartezz
Отправлено: 30 Мая, 2012 - 17:34:25
Post Id



Гость


Покинул форум
Сообщений всего: 70
Дата рег-ции: Февр. 2010  


Помог: 1 раз(а)




eai пишет:
Если у вас один и тот же файл на каждое обращение грузиться в память то нужно думать о долго живущих объектах.

под "ним" я имел в виду массив, файл грузится в память только один раз в начале работы


К сожалению сия действия не возымели эффекта (возможно немного, но не существенно), поскольку замедление идет не на этапе объявления переменной в функции, а уже непосредственно при работе с ней. Да и до этого массив не передавался напрямую, значение получалось через

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

Возможно замедление дает функция rand(), которая выбирает несколько случайных элементов из массива (до 50), но диапазон значений не такой уж и большой от 0 до 100 000 (максимум 150 000 (в зависимости от размера $file))

Проблема актуальна

(Отредактировано автором: 30 Мая, 2012 - 17:55:33)

 
 Top
caballero
Отправлено: 30 Мая, 2012 - 17:54:29
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




и сколько раз эта функция вызывается?


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Bartezz
Отправлено: 30 Мая, 2012 - 17:57:55
Post Id



Гость


Покинул форум
Сообщений всего: 70
Дата рег-ции: Февр. 2010  


Помог: 1 раз(а)




caballero пишет:
и сколько раз эта функция вызывается?


Около 1000 раз за один запрос, бывает и больше, но среднее значение где то 1000

В упрощенном варианте код имеет вид

PHP:
скопировать код в буфер обмена
  1. include_once "some_function.php";
  2.  
  3. // файл который содержит примерно 100 000 строк текста, каждая строка длинной 50-200 символов (ориентировочно)
  4. $file=file("some_file.txt");
  5.  
  6. for ($i=0; $i<=1000; $i++)
  7. {
  8. // функция выполняет выбор нескольких строк (к примеру 50 штук) из массива $file, проводит с ними несложные манипуляции, после чего возвращает строку $output состаящую из этих 50 обработанных элементов
  9. $output=some_function(&$file); // или без передачи параметров, а внутри функция содержит global $file;
  10.  
  11. $hand = fopen ("new_file_{$i}.txt", "w");
  12. fwrite ($hand, $output);
  13. fclose($hand);
  14. }

(Отредактировано автором: 30 Мая, 2012 - 18:17:45)

 
 Top
caballero
Отправлено: 30 Мая, 2012 - 18:07:08
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




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


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Bartezz
Отправлено: 30 Мая, 2012 - 18:14:45
Post Id



Гость


Покинул форум
Сообщений всего: 70
Дата рег-ции: Февр. 2010  


Помог: 1 раз(а)




[quote=caballero]значит кроме самого массива создаются локальные переменные или типа того.[/quote]
да, разумеется
[quote=caballero] убери функциию и юзай код м нее непосредственно, какие прблеммы

нет собственно никаких проблем, но там и так код черт, ногу сломает и надоели постоянные include вместо функций (тем более они замедляют работу), хотел сделать по-человечески

(Отредактировано автором: 30 Мая, 2012 - 18:16:21)

 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB