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 :: Пользовательская функция перегружается из-за большого массива
Покинул форум
Сообщений всего: 70
Дата рег-ции: Февр. 2010
Помог: 1 раз(а)
Есть большой массив примерно 100 000 элементов, каждый из которых строка длинной 50-200 символов. При использовании этого массива в пользовательской функции (и через global и через передачу параметров) скорость работы скрипта замедляется в десятки раз, если его вынести за функцию и все операции с ним выполнять вне ее, или же вовсе не создавать пользовательскую функцию, то скорость выполнения нормальная.
Возможно что то неверно в настройках php, использую версию 5.2.12 и выставлено использование памяти 512 мб, выполняется все на локальном компьютере под денвером
Кто-нибудь может подсказать как решить эту проблему?
// функция выполняет выбор нескольких строк (к примеру 50 штук) из массива $file, проводит с ними несложные манипуляции, после чего возвращает строку $output состаящую из этих 50 обработанных элементов
Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010
Помог: 53 раз(а)
есть такая особенность работы пыхи с массивами, везде где не указано на прямую работать с оригианлом пыха производит перед обработкой копирование массива, а потом обратно,
выходом будет передавать указатель на массив "&$array"
Bartezz
Отправлено: 30 Мая, 2012 - 16:58:05
Гость
Покинул форум
Сообщений всего: 70
Дата рег-ции: Февр. 2010
Помог: 1 раз(а)
eai, DlTA спасибо, попробую таким образом решить проблему
Покинул форум
Сообщений всего: 521
Дата рег-ции: Сент. 2009 Откуда: Петроград
Помог: 10 раз(а)
Это не решение проблемы а затыкание дырки.
Вам что то с архитектурой менять надо, ибо отрабатывать 100000 строк в реквесте это не есть хорошо и не соответствует духу вэб приложения, да в конце концов просто упадет от небольшого наплыва пользователей,
Bartezz
Отправлено: 30 Мая, 2012 - 17:11:15
Гость
Покинул форум
Сообщений всего: 70
Дата рег-ции: Февр. 2010
Помог: 1 раз(а)
eai пишет:
Это не решение проблемы а затыкание дырки.
Вам что то с архитектурой менять надо, ибо отрабатывать 100000 строк в реквесте это не есть хорошо и не соответствует духу вэб приложения, да в конце концов просто упадет от небольшого наплыва пользователей,
никакого большого наплывала пользователей не будет, это веб приложение создано именно для того чтобы обратывать эти строки постоянно, будь то локальный компьютер или выделенный сервер, массив заполняется только в начале работы, после чего (в зависимости от объема) идет обработка данных, запись, архивирование и прочее и этот процесс может продлиться и больше часа если данных на выходе очень много. И работать с этим приложением буду только я, весь сервер буду нагружать только я один. И разумеется этот большой массив не используется единожды, обращение к нему по ходу выполнения происходят тысячи раз, а введение пользовательской функции, которая (по идеи) должна была ускорить работу и облегчить восприятие кода принесла только увеличение времени работы
К сожалению сия действия не возымели эффекта (возможно немного, но не существенно), поскольку замедление идет не на этапе объявления переменной в функции, а уже непосредственно при работе с ней. Да и до этого массив не передавался напрямую, значение получалось через
пользовательская функция по какой то причине в несколько десятков раз медленне работает с таким массивом.
Возможно замедление дает функция rand(), которая выбирает несколько случайных элементов из массива (до 50), но диапазон значений не такой уж и большой от 0 до 100 000 (максимум 150 000 (в зависимости от размера $file))
// функция выполняет выбор нескольких строк (к примеру 50 штук) из массива $file, проводит с ними несложные манипуляции, после чего возвращает строку $output состаящую из этих 50 обработанных элементов
$output=some_function(&$file);// или без передачи параметров, а внутри функция содержит global $file;
Покинул форум
Сообщений всего: 70
Дата рег-ции: Февр. 2010
Помог: 1 раз(а)
[quote=caballero]значит кроме самого массива создаются локальные переменные или типа того.[/quote]
да, разумеется
[quote=caballero] убери функциию и юзай код м нее непосредственно, какие прблеммы
нет собственно никаких проблем, но там и так код черт, ногу сломает и надоели постоянные include вместо функций (тем более они замедляют работу), хотел сделать по-человечески
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.