I assume when you say “ex level 4” you mean “ex1 ex2 ex3 ex4”. Design on 30 residues with ex1, 2, 3, and 4 is going to use a TON of memory – 16 GB is higher than I’d predict, but not surprising. I don’t know if there are any memory inefficiencies in PyRosetta relative to regular Rosetta w/r/t packing; I’d guess not.
Turning on the -linmem_ig functionality (flag is “-linmem_ig 20”; there’s a PackerTask function call for it too) will fix your memory issue.