Drupal (6.19) cron исчерпывает память при индексировании поиска

Моя установка Drupal 6.19 работает около шести месяцев. Клиент активно использует его для публикации большего количества контента.

Однако что-то произошло, потому что теперь cronjob не заканчивается.

Неустранимая ошибка: допустимый размер памяти 134217728 байт исчерпан (пытался выделить 36230464 байт) в /XXX/modules/search/search.module в строке 444

Как вы видите, у меня есть ограничение памяти 128M в PHP.ini и search.module пытается выделить довольно большую сумму, 36M. Поскольку я не могу придумать какую-либо причину, почему search.module сделает это, я спрашиваю вас, если у вас есть какие-то намеки, как я могу продолжить. Увеличение ограничения памяти невозможно, поскольку Drupal находится в среде размещения.

Я ограничил индексацию до 10 узлов и изменил кратчайшую длину слова на 5 символов. Я не понимаю, как индексирование 10 узлов все равно будет потреблять всю эту память.

Как отлаживать? Что попробовать? Любые идеи были бы хорошы!

Посмотрите на строку 444 в /XXX/modules/search/search.module, какой там код?

Я думаю, нам нужно больше узнать о содержании вашего сайта. Насколько большой сайт? Сколько узлов? Сколько текста на узел, примерно?

Проверьте в своей базе данных, сколько хранилищ используют ваши узлы? Каков размер всей базы данных?

У вас установлен модуль, который позволяет вам искать файлы и файлы в файловой системе (например, http://drupal.org/project/search_files )?

Хорошо, поэтому вы говорите, что клиент публикует больше контента. У нас нет информации о том, сколько памяти ранее использовалось cronjob. Скорее всего, вы были правы под своими ограничениями по памяти до недавнего времени, и теперь вы прошли. Такие вещи происходят все время, когда люди, которые не знают, что делают, создают веб-сайты.

Как продвигаться дальше? Увеличьте распределение памяти для модуля поиска. Я имею в виду, это кажется немного очевидным. Вы беспокоитесь, что это не будет масштабироваться? Ну, вы действительно не знаете наверняка, потому что до сих пор вы не обсуждали проблему.

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

Мое первое подозрение в том, что в очереди стоит большой узел, в который вы попадаете. Есть несколько способов проверить это:

Проверьте таблицу search_dataset в своей базе данных на самый большой sid который соответствует узлу вашего сайта. Затем посмотрите на узлы с большими размерами, чем это. Является ли один из них ненормально большим или каким-то странным? Попробуйте отредактировать его, чтобы иметь пустое тело (обязательно сохраните старую ревизию) и посмотрите, поможет ли это.

Если нет – комментарий, и мы попробуем что-нибудь еще.