Dipende molto dal flusso delle attività... se puoi permetterti di generare il file senza aspettare la fine dell'operazione l'ideale sarebbe agire in maniera asincrona, lanciando un processo che si occupa di fare ciò che dici restituendo subito il controllo all'utente.
Per capire meglio la situazione dovresti intanto analizzare il problema (cominciando con test "locali") e suddividere il tempo dello script almeno in:
- tempo di elaborazione sul db
- tempo di elaborazione del contenuto
- tempo di elaborazione sul file system (prova a calcolare il tempo necessario al salvataggio di un file indicato, ma già elaborato, p.es.)
- tempo di accesso http
in modo da valutare dove intervenire... probabilmente il tempo "grosso" è il secondo o il terzo: se fosse il secondo si potrebbe lavorare sull'algoritmo utilizzato, fermo restando che i MB indicati non sono comunque pochi.