Como outra opção - tenho um processo semelhante, mas não escrevo nada em disco, pois atendo arquivos multi-GB.
Em vez disso, apenas emito os cabeçalhos HTTP apropriados (incluindo Content-Disposition para definir o nome do arquivo) e, em seguida, entrego para o zip (ou tar) com os sinalizadores apropriados para que eles gravem no stdout.
Quanto ao dimensionamento - tenho arquivos grandes, mas não os envio com frequência. Eu faço passar por 'legal' para poder abandonar a prioridade do processo de arquivamento.
Minha única preocupação com o meu sistema é a incapacidade de recuperar uma transferência parcial sem começar de novo, mas você especificamente disse que deseja limpar transferências bem-sucedidas e mal-sucedidas.