PHP_AMQP проблемы с consume

14 views
Skip to first unread message

Alexandre Kalendarev

unread,
Oct 14, 2010, 1:49:32 AM10/14/10
to rabbit...@googlegroups.com
Метод Consume падает из-за нехватки память
падения начинаются от 1000 элементов

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

Хочу в ближайшее время пересмотреть алгоритм consume и сделать обработку сообщений через callback

будет что-то типа вызова:

function callback_function( $message, $header
    /// $message тело сообщения, $header - заголовок, аналогично методу GET
    return true/false - продолжить подписку или сбросить и выйти из consume
) {...}

 $q->consume( callback_function, $parms);

Продуктивность GET 
count=1000 time=0.407700061798 sec rpq 2452
count=1000 time=0.416295051575 sec rpq 2402

Продуктивность CONSUME
count=10 time=0.00121688842773 sec rpq 8217
count=10 time=0.00119400024414 sec rpq 8375
count=10 time=0.00156998634338 sec rpq 6369
count=10 time=0.00133895874023 sec rpq 7468

разница как видно раза в два
так что есть за что побороться


Dmitry

unread,
Oct 14, 2010, 2:32:07 AM10/14/10
to rabbit...@googlegroups.com
Странно, 1000 элементов – не те объемы, чтобы начинались падения
Или я что-то недопонимаю?

Alexandre Kalendarev

unread,
Oct 14, 2010, 4:56:33 AM10/14/10
to rabbit...@googlegroups.com
точная грань зависит от размера нефрагментированной свободной памяти.
на 10 000 падает через 5-7 итераций ( делаем чтение итерациями по 10 000 записей)
на 1000 падает через 10-20 итераций. 
возможно как-то не правильно отрабатывается освобождение памяти либо у меня,
либо просто в итерации надо освобождать unset() принятый массив
не факт что unset правильно высвободит память.
 
но сама идея такова - не нужно строить огромный аррай и его обрабатыват,
а делать обработку в кэлбеке.

14 октября 2010 г. 10:32 пользователь Dmitry <dmitry...@yandex.com> написал:
Reply all
Reply to author
Forward
0 new messages