Не знаю, ограничены ли вы только скриптами или можете использовать что-то кроме них, но посоветую использовать библиотеку libjpeg (или её прокаченный вариант libjpeg-turbo) и её функции для построчного чтения и записи в jpeg файл (scanline методы). В этом случае, вам понадобится очень мало памяти (несколько мегабайт) для выполнения вашей задачи, но придётся поработать с низкоуровневым api сишной библиотеки.
У этой же библиотеки есть и ещё одна фишка - lossless склейка jpeg файлов. Для этого даже написана консольная утилита jpegtran, которая идёт в архиве с библиотекой. Только эта фишка уже использует оперативку по полной и 16Гб вам очень пригодятся.