Зараз я працюю над багатопотоковим завантажувачем за допомогою модуля PycURL. Я завантажую частини файлів і зливаю їх згодом.
Частини завантажуються окремо з декількох потоків, вони записуються у тимчасові файли у двійковому режимі, але коли я об'єдную їх у один файл (вони об’єднуються у правильному порядку), контрольні суми не відповідають.
Це відбувається тільки в Linux env. Цей же сценарій працює бездоганно у Windows env.
Це код (частина сценарію), який об'єднує файли:
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!')
Я також спробував write()
метод, але це призводить до того ж питання, і для великих файлів знадобиться багато пам'яті.
Якщо я вручну cat
розміщую файли деталей в один файл в Linux, то контрольна сума файлу відповідає, проблема полягає в злитті файлів python.
EDIT:
Ось файли та контрольні суми (sha256), які я використовував для відтворення проблеми:
- Оригінальний файл
- HASH: 158575ed12e705a624c3134ffe3138987c64d6a7298c5a81794ccf6866efd488
- файл об'єднаний за сценарієм
- HASH: c3e5a0404da480f36d37b65053732abe6d19034f60c3004a908b88d459db7d87
файл об'єднаний вручну за допомогою cat
- HASH: 158575ed12e705a624c3134ffe3138987c64d6a7298c5a81794ccf6866efd488
Використовувана команда:
for i in /tmp/pycurl_*_{0..7}; do cat $i >> manually_merged.tar.gz; done
Файли частин - нумеровані в кінці, від 0 до 7
filename
, self.tempfile_arr
і shutil
не визначена
open
режим неправильний (wb
). На основі stackoverflow.com/a/4388244/3727050 вам потрібноab
(абоr+b
іseek
)