Персональные блоги

Обработка больших массивов данных в Drupal 6 используя batch API, очереди и крон

Втягиваю в друпал 6 данные из внешнего источника двумя способами: интерактивно через Batch API и в кроне через drupal_queue
 
 
16.07.2011 — 00:05

Комментарии (3)

Аватар пользователя andypost
22.07.2011 — 13:05
-1
 
 

Очень странно, что так мало отзывов, постанул автору комент — не раскрыта техника использования батча для больших массивов, ибо по коду видно, что весь 70-ти метровый документ загружается в память и потом разбирается в очереди.

Важным плючом очереди — является именно возможност уверенно обойти/обработать все элементы, но вот иметь каждый раз в памяти весь документ стрёмно…

Аватар пользователя varvashenia
22.07.2011 — 14:02
0
 
 

Да, 70-и метровый архив таки весь грузится в память и bath в этом месте умирает — когда делал через Bath API у меня перед глазами стоял пример данных из 15..30 строчек XML и это должно было работать везде, где работает друпал даже будь там данных в 10 раз больше.
Но когда пришли живые данные выжил только вариант через drupal_queue — оно запускается в cron и ему вполне хватает памяти растащить xml на таски и уже потом неспешно их закончить.
Точные цифры сейчас не скажу — при случае гляну — лимит на сервере был не меньше 128 и не больше 256М.
В идеале нужно было применить решение, которое не пихает сразу весь xml в память, а читает его по мере необходимости. Например XMLReader.
Применительно к Batch API алгоритм слегка изменится — в начале загружаем файл локально, натравливаем на него XMLReader и дальше разбираем на таски.
Если файл совсем большой и не влазит в отпущенный лимит времени, то нужно что-бы каждый hook_batch_job открывал xml-файл, прокручивал до определённого сохранённого состояния и дальше парсил отпущенный кусок/куски в отпущенное время.

Аватар пользователя varvashenia
24.07.2011 — 23:16
0
 
 

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