Tôi hiện đang làm việc trên một trình tải xuống đa luồng với sự trợ giúp của mô-đun PycURL. Tôi đang tải xuống các phần của các tập tin và hợp nhất chúng sau đó.
Các phần được tải xuống riêng biệt từ nhiều luồng, chúng được ghi vào các tệp tạm thời ở chế độ nhị phân, nhưng khi tôi hợp nhất chúng thành một tệp duy nhất (chúng được hợp nhất theo đúng thứ tự), tổng kiểm tra không khớp.
Điều này chỉ xảy ra trong linux env. Kịch bản tương tự hoạt động hoàn hảo trong Windows env.
Đây là mã (một phần của tập lệnh) hợp nhất các tệp:
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!')
Tôi cũng đã thử write()
phương pháp này, nhưng nó cũng dẫn đến một vấn đề tương tự và nó sẽ chiếm rất nhiều bộ nhớ cho các tệp lớn.
Nếu tôi thủ công cat
các phần của tệp thành một tệp duy nhất trong linux, thì tổng kiểm tra khớp với tệp, thì vấn đề là do việc hợp nhất các tệp của python.
EDIT:
Dưới đây là các tệp và tổng kiểm tra (sha256) mà tôi đã sử dụng để tái tạo vấn đề:
- Tập tin gốc
- HASH: 158575ed12e705a624c3134ffe3138987c64d6a7298c5a81794ccf6866efd488
- tập tin được hợp nhất bởi tập lệnh
- HASH: c3e5a0404da480f36d37b65053732abe6d19034f60c3004a908b88d459db7d87
tập tin được hợp nhất thủ công bằng cách sử dụng mèo
- HASH: 158575ed12e705a624c3134ffe3138987c64d6a7298c5a81794ccf6866efd488
Lệnh được sử dụng:
for i in /tmp/pycurl_*_{0..7}; do cat $i >> manually_merged.tar.gz; done
Phần tệp - được đánh số ở cuối, từ 0 đến 7
filename
, self.tempfile_arr
, và shutil
được undefined
open
chế độ của bạn không đúng (wb
). Dựa trên stackoverflow.com/a/4388244/3727050 bạn cầnab
(hoặcr+b
vàseek
)