Finalmente consegui encontrar a solução. Descobri que quando o lixo da coleção do PHP está ficando cheio, não há como liberá-lo.
Unset e gc_collect_cycles() também não são eficazes. A única maneira é usar Function em diferentes seções de códigos. No meu caso, eu tinha um script grande em um loop for, então copiei todos os meus códigos em uma função, e no meu loop eu chamo a função. Cada vez que a função silencia, a memória fica livre. Você pode testá-lo adicionando memory_get_usage() uma vez em sua função e uma vez fora da função para ver a diferença.