Attualmente sto lavorando su un downloader multi-thread con l'aiuto del modulo PycURL. Sto scaricando parti dei file e unendole successivamente.
Le parti vengono scaricate separatamente da più thread, vengono scritte in file temporanei in modalità binaria, ma quando le unisco in un singolo file (vengono unite nell'ordine corretto), i checksum non corrispondono.
Questo succede solo in Linux Env. Lo stesso script funziona perfettamente in ambiente Windows.
Questo è il codice (parte dello script) che unisce i file:
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!')
Ho provato anche il write()
metodo, ma risulta con lo stesso problema e ci vorrà molta memoria per file di grandi dimensioni.
Se cat
inserisco manualmente i file di parti in un singolo file in Linux, quindi il checksum del file corrisponde, il problema è con l'unione dei file di Python.
EDIT:
Ecco i file e i checksum (sha256) che ho usato per riprodurre il problema:
- File originale
- HASH: 158575ed12e705a624c3134ffe3138987c64d6a7298c5a81794ccf6866efd488
- file unito dallo script
- HASH: c3e5a0404da480f36d37b65053732abe6d19034f60c3004a908b88d459db7d87
file unito manualmente tramite cat
- HASH: 158575ed12e705a624c3134ffe3138987c64d6a7298c5a81794ccf6866efd488
Comando utilizzato:
for i in /tmp/pycurl_*_{0..7}; do cat $i >> manually_merged.tar.gz; done
File di parti : numerati alla fine, da 0 a 7
filename
, self.tempfile_arr
, e shutil
non sono definiti
open
modalità non sia corretta (wb
). Basato su stackoverflow.com/a/4388244/3727050 necessarioab
(or+b
eseek
)