Maybe have a look at this post How to choose the optimal solver for a PDE problem? - #2 by nate
Maybe changing the solver from a direct solver to a iterative one can help:
solver = PETScKrylovSolver('gmres', 'hypre_euclid')
prm = solver.parameters
prm['absolute_tolerance'] = 1E-10
prm['relative_tolerance'] = 1E-6
prm['maximum_iterations'] = 1000
prm['monitor_convergence'] = False