Actualmente estoy trabajando en un descargador multiproceso con la ayuda del módulo PycURL. Estoy descargando partes de los archivos y fusionándolos después.
Las partes se descargan por separado de varios subprocesos, se escriben en archivos temporales en modo binario, pero cuando las fusiono en un solo archivo (se fusionan en el orden correcto), las sumas de verificación no coinciden.
Esto solo ocurre en linux env. El mismo script funciona a la perfección en Windows env.
Este es el código (parte del script) que combina los archivos:
with open(filename,'wb') as outfile:
print('Merging temp files ...')
for tmpfile in self.tempfile_arr:
with open(tmpfile, 'rb') as infile:
shutil.copyfileobj(infile, outfile)
print('Done!')
También probé el write()
método, pero resulta con el mismo problema, y tomará mucha memoria para archivos grandes.
Si manualmente cat
los archivos de pieza en un solo archivo en Linux, entonces la suma de comprobación del archivo coincide, el problema es con la fusión de archivos de Python.
EDITAR:
Aquí están los archivos y sumas de comprobación (sha256) que utilicé para reproducir el problema:
- Archivo original
- HASH: 158575ed12e705a624c3134ffe3138987c64d6a7298c5a81794ccf6866efd488
- archivo fusionado por script
- HASH: c3e5a0404da480f36d37b65053732abe6d19034f60c3004a908b88d459db7d87
archivo combinado manualmente usando cat
- HASH: 158575ed12e705a624c3134ffe3138987c64d6a7298c5a81794ccf6866efd488
Comando utilizado:
for i in /tmp/pycurl_*_{0..7}; do cat $i >> manually_merged.tar.gz; done
Archivos de pieza : numerados al final, del 0 al 7
filename
, self.tempfile_arr
y shutil
no están definidos
open
modo no es correcto (wb
). Sobre la base de stackoverflow.com/a/4388244/3727050 que es necesarioab
(or+b
yseek
)