Что делать, если скрипт съедает 50Гб памяти?
Я всегда выступал за то, что в большинстве случаев надо, в первую очередь, оптимизировать время разработчика, а не пытаться написать самый быстрый и нетребовательный к ресурсам код. Если код работает медленно или съедает много памяти, то можно это иногда обходить другими путями.
В моём текущем проекте есть Customers, у которых есть много Orders. Надо эти Orders обработать и вывести обработанную информацию.
-
foreach ($customers as &$customer) {
-
$id = $customer['Customer']['id'];
-
-
$orders = $this->processOrders($id); // eats a lot of memory
-
$customer['Order'] = $orders;
-
}
-
Но функция processOrders($customerId) работает как-то странно, при каждом новом вызове съедая 100Мб памяти. И после 40 клиентов заканчивается физическая память и начинается жуткий своп.
Программист-идеалист разбирался бы в этой странной функции долго и нудно, смотрел, где утечка памяти, оптимизировал алгоритм. Я посмотрел мельком на эту функцию, понял, что на её понимание может уйти несколько часов. Потом заметил, что для каждого клиента обработка заказов происходит только один раз и можно просто разбить работу скрипта на части. Пусть скрипт обрабатывает 10 клиентов (съедая всего 1Гб памяти), а потом перезапускается.
-
$counter = 0;
-
foreach ($customers as $customer) {
-
$id = $customer['Customer']['id'];
-
-
if (Cache::read('Customer.Order.'.$id)==false) {
-
$orders = $this->processOrders($id); // eats a lot of memory
-
Cache::write('Customer.Order.'.$id, $orders);
-
if (++$counter>=10) {
-
}
-
}
-
}
-
-
foreach ($customers as &$customer) {
-
$id = $customer['Customer']['id'];
-
$customer['Order'] = Cache::read('Customer.Order.'.$id);
-
}
-
При этом получаем дополнительный бонус - если надо будет обработать заказы новых клиентов, то старые не будут заново обрабатываться, так как результат закеширован.
Спасибо CakePHP Cache и JavaScript.
А какой кешевый движок используешь?
И получается что когда ты страничку перезагружаешь, ты заново проходишь по списку, но обрабатываешь клиента если он не обработан? может лучше передавать параметр где хранится последний обработанный клиент?
можно, но так быстрее (для меня, а не компьютера) и надёжнее (вдруг в процессе ещё клиенты добавятся)
Можно и так.
заметил там window.location.reload(true)
если доработать дальше, то всё это можно сделать "красивенько" добавив немного ajax и эффектов(по желанию)
Второй foreach, думаю, можно убрать
PS хотя всёравно както ужасно смотрится, мне кажется что струтура полученных данных не оптимальн, но это имхо.
угу, в location.reload вся соль. true указывает браузеру, что страницу не надо брать из кеша.
весь код исполняется 5 минут, просто памяти много съедает. вдобавок непонятно, надо будет ли вообще хотя бы ещё раз исполнять код. поэтому спецэффекты ни к чему как и оптимизация именно этого куска кода.
Это задача не для пхп (точней не тот пхп который показывает странички)!
вы на пхп странички обрабатывайте а все тяжолые процены уже другие должны делать (у меня например за это отвечают отдельные пхп скрипты на кроне)
жудкий -> жуткий
спасибо, исправил
я как сисадмин за такое руки бы поотрывал.
я бы как технический директор за это уволил
на своём компьютере что хочу, то и делаю. конечно, на живом сервере такого делать нельзя.
Зачем в первом варианте было множить контейнер?
$orders = $this->processOrders($id); // eats a lot of memory
$customer['Order'] = $orders;
так не проще и по затратам памяти легче?
$customer['Order'] = $this->processOrders($id);
чтобы на 1024х768 код с комментариями не вылезал за пределы экрана
Вова, а какой редактор используешь? Просто интересно.
Я пользуюсь сразу тремя редакторами:
1. Мелочь поправить - Notepad++
2. На хороших компьютерах: Zend IDE + их же дебаг
3. На ноутбуках: Komodo + XDebug
Если основной язык не PHP, а HTML+CSS+JS, то хорошие Dreamweaver и Aptana. Через год, возможно, будет нормальной PDT на Eclipse или Zend на Eclipse.
Для блога - Notepad++ или Word.
Спасибо за ответ. Я хотя бы узнал на чем пишут тру программисты.
[...] Что делать, если скрипт съедает 50Гб памяти? [...]
[...] Что делать, если скрипт съедает 50Гб памяти? [...]
Простите за оффтопик, нигде не могу найти ваш контактный почтовый адрес.
Вы можете со мной связаться? Разговор касается сотрудничества.
С уважением.
отписался на почту
Тоже простите за оффтопик,
интересно, как реализуете на cakePHP многоязычность сайта?
IСQ 345560714
И уж я за одно, простите поофтопю. Владимир, может действительно контактный формялр чтоли сделаете
Ищем специалиста по кейку для реализации нового проекта в германии. Владимир, будем рады вашему интересу.
jinis_services yahoo de
Интересная статья, спасибо, много полезного узнал, в т.ч. и в коментах)
Ни фига себе скриптик, 50 ГБ памяти - это где хоть столько можно взять? Я 4 максимум видел!?!
в swap-файле
Плохое решение.
Пахнет подпорками и кривостью при первом же взгляде.
Ситуативное решение которое в будущем вылезет в очередной фикс