Quiero permitir a los usuarios descargar un archivo de varios archivos grandes al mismo tiempo. Sin embargo, los archivos y el archivo pueden ser demasiado grandes para almacenarlos en la memoria o en el disco de mi servidor (se transmiten desde otros servidores sobre la marcha). Me gustaría generar el archivo mientras lo transmito al usuario.Crear y transmitir un archivo grande sin almacenarlo en la memoria o en el disco
Puedo usar Tar o Zip o lo que sea más simple. Estoy usando django, que me permite devolver un generador o un objeto similar a un archivo en mi respuesta. Este objeto podría usarse para impulsar el proceso. Sin embargo, tengo problemas para descubrir cómo crear este tipo de cosas en las bibliotecas de archivo zip o tarfile, y me temo que es posible que no sean compatibles con la lectura de archivos a medida que avanzan o al leer el archivo tal como está desarrollado.
Esta respuesta en converting an iterator to a file-like object podría ayudar. tarfile#addfile
toma un iterable, pero parece pasarlo inmediatamente al shutil.copyfileobj
, por lo que puede que no sea tan favorable para el generador como esperaba.
En general, las herramientas de compresión como zip o tar necesitan leer todo el archivo de entrada para determinar qué se puede y se debe comprimir. Entonces creo que tu idea de arquitectura es defectuosa. – jedwards
@jedwards: bastante mal; 'tar' es solo un contenedor, sin compresión. Fue diseñado para trabajar con _tapes_ - donde leer la cosa completa primero estaba fuera de discusión. Y 'zlib' comprimirá _happy_ una secuencia de datos. Puede obtener una mejor compresión con un archivo completo, pero eso de ninguna manera es obligatorio. – sarnold
@sarnold, supuse que se refería a un archivo comprimido ya que estaba hablando de compresión. Y zlib aún necesita almacenar en caché una cantidad de bytes de entrada antes de generar resultados porque el mismo requerimiento de analizar los datos de entrada permanece. Así que estoy de acuerdo en que me equivoqué con "todo", pero sigo sosteniendo que esto tiene poco sentido ya que la cantidad de datos que ahorrará al comprimir segmentos de flujo pequeños será insignificante para la cantidad de trabajo dedicado a la escritura. – jedwards