Основная проблема - это обращение к БД в цикле, каждый раз. Помимо долгого ожидания Вы так и БД перегружаете.
Для пакетной обработки не нужно никаких отдельных инструментов и библиотек. Вы просто собираете все данные в локальный массив, устанавливаете предел обработки пачки, после достижения предела делаете ОДИН запрос в БД.
Если у Вас идёт обращение к разным таблицам, то можно либо JOIN-ами выводить нужные данные, если таблицы пересекаются, либо отдельно готовить под каждую таблицу свой массив для выборки.
Если предел размерности у Вас небольшой, допустим 100 элементов, то там и на пачки разбивать не обязательно. Всё, что Вам нужно сделать - это вынести из цикла все обращения к БД, оставив только подготовку данных, для дальнейших запросов