Je travaille actuellement sur un téléchargeur multi-thread avec l'aide du module PycURL. Je télécharge des parties des fichiers et les fusionne ensuite.
Les parties sont téléchargées séparément à partir de plusieurs threads, elles sont écrites dans des fichiers temporaires en mode binaire, mais lorsque je les fusionne en un seul fichier (elles sont fusionnées dans le bon ordre), les sommes de contrôle ne correspondent pas.
Cela ne se produit que dans Linux Env. Le même script fonctionne parfaitement dans Windows env.
C'est le code (partie du script) qui fusionne les fichiers:
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!')
J'ai également essayé la write()
méthode, mais elle entraîne le même problème et il faudra beaucoup de mémoire pour les gros fichiers.
Si j'utilise manuellement cat
les fichiers de pièces dans un seul fichier sous Linux, la somme de contrôle du fichier correspond alors, le problème est lié à la fusion de fichiers par Python.
EDIT:
Voici les fichiers et les sommes de contrôle (sha256) que j'ai utilisés pour reproduire le problème:
- Fichier d'origine
- HASH: 158575ed12e705a624c3134ffe3138987c64d6a7298c5a81794ccf6866efd488
- fichier fusionné par script
- HASH: c3e5a0404da480f36d37b65053732abe6d19034f60c3004a908b88d459db7d87
fichier fusionné manuellement à l'aide de cat
- HASH: 158575ed12e705a624c3134ffe3138987c64d6a7298c5a81794ccf6866efd488
Commande utilisée:
for i in /tmp/pycurl_*_{0..7}; do cat $i >> manually_merged.tar.gz; done
Fichiers pièce - numérotés à la fin, de 0 à 7
filename
, self.tempfile_arr
et ne shutil
sont pas définies
open
mode n'est pas correct (wb
). Basé sur stackoverflow.com/a/4388244/3727050 dont vous avez besoinab
(our+b
etseek
)