1. Про нехватку памяти проверьте сначала, запутить скрипт и в консоле запустите top - наблюдайте как растёт память.
2. Если у вас 5млн записей, то вы принципиально неправильно сделали работу. Вы зачитываете в память сразу всё, хотя ваша единичная операция требует всего одного продукта.
Пишите код правильно, а не делайте костыли, которые восстанавливают работу после того как что-то у вас отвалилось.
3. Вы поулчаете данные по 1000 позиций в connect ... встройте туда же вашу обработку для Product, тупо копипастом хотя бы - это решит проблемы с памятью, если проблема именно в этом.
Обрбатывайте по 1000 позиций за раз.
Ещё поясню:
- когда заканчивается память - это нештатная ситуация для всей системы и для СУБД в первую очередь, есть вероятность потерять данные
- сохранять состояние offset для client.service.doGetItemsList тоже хорошая идея для случаев обрыва связи, но это только если она у вас рвётся